Bei Verwendung der neueren ASP.NET-Web-API wird in Chrome XML angezeigt. Wie kann ich es ändern, um JSON anzufordern, damit ich es im Browser anzeigen kann? Ich glaube, es ist nur ein Teil der Anforderungsheader. Stimmt das?
json
google-chrome
asp.net-web-api
naspinski
quelle
quelle
Antworten:
Ich füge
App_Start / WebApiConfig.cs
in meinem MVC- Web-API- Projekt nur Folgendes in der Klasse hinzu .Das stellt sicher, dass Sie JSON für die meisten Abfragen erhalten, aber Sie können es erhalten,
XML
wenn Sie sendentext/xml
.Wenn Sie die Antwort haben müssen ,
Content-Type
wieapplication/json
überprüfen Sie bitte Todd Antwort unten .NameSpace
verwendetSystem.Net.Http.Headers
.quelle
Content-Type
Header der Antwort weiterhin angezeigt wirdtext/html
.Wenn Sie diese in das tun
WebApiConfig
werden Sie JSON standardmäßig, aber es wird immer noch ermöglichen es Ihnen , XML zurück , wenn Sie passierentext/xml
alsAccept
AnforderungskopfWenn Sie den MVC-Projekttyp nicht verwenden und diese Klasse daher zunächst nicht hatten, finden Sie in dieser Antwort Einzelheiten zur Einbindung.
quelle
application/xml
mit einer Priorität von 0,9 und*/*
einer Priorität von 0,8. Durch Entfernenapplication/xml
entfernen Sie die Möglichkeit für die Web-API, XML zurückzugeben, wenn der Client dies ausdrücklich anfordert. Wenn Sie beispielsweise "Accept: application / xml" senden, erhalten Sie weiterhin JSON.Die Verwendung von RequestHeaderMapping funktioniert noch besser, da auch der
Content-Type = application/json
Antwortheader festgelegt wird, sodass Firefox (mit JSONView-Add-On) die Antwort als JSON formatieren kann.quelle
Ich mag den Ansatz von Felipe Leusin am besten - stellen Sie sicher, dass Browser JSON erhalten, ohne die Inhaltsverhandlung von Clients zu beeinträchtigen, die tatsächlich XML möchten. Das einzige fehlende Teil für mich war, dass die Antwortheader immer noch den Inhaltstyp enthielten: text / html. Warum war das ein Problem? Weil ich die JSON Formatter Chrome-Erweiterung verwende , die den Inhaltstyp überprüft, und nicht die hübsche Formatierung bekomme, die ich gewohnt bin. Ich habe das mit einem einfachen benutzerdefinierten Formatierer behoben, der Text- / HTML-Anforderungen akzeptiert und Anwendungs- / JSON-Antworten zurückgibt:
Registrieren Sie sich wie folgt:
quelle
this.SerializerSettings.Formatting = Formatting.Indented;
Sie im Konstruktor hinzu, wenn Sie möchten, dass es ohne Browsererweiterung hübsch gedruckt wird.using System.Net.Http.Formatting
undusing Newtonsoft.Json
MVC4-Kurztipp 3 - Entfernen des XML-Formatierers aus der ASP.Net-Web-API
In
Global.asax
die Zeile:wie so:
quelle
Fügen Sie in der Datei WebApiConfig.cs am Ende der Registerfunktion Folgendes hinzu :
Quelle .
quelle
In der Global.asax verwende ich den folgenden Code. Meine URI, um JSON zu erhalten, ist
http://www.digantakumar.com/api/values?json=true
quelle
Schauen Sie sich die Inhaltsverhandlung in der WebAPI an. Diese ( Teil 1 & Teil 2 ) wunderbar detaillierten und gründlichen Blog-Beiträge erklären, wie es funktioniert.
Kurz gesagt, Sie haben Recht und müssen nur die
Accept
oderContent-Type
Anforderungsheader festlegen. Da Ihre Aktion nicht für die Rückgabe eines bestimmten Formats codiert ist, können Sie festlegenAccept: application/json
.quelle
Da die Frage Chrome-spezifisch ist, können Sie die Postman-Erweiterung erhalten , mit der Sie den Inhaltstyp der Anforderung festlegen können.
quelle
network.http.accept.default
Konfiguration intext/html,application/xhtml+xml,application/json;q=0.9,application/xml;q=0.8,*/*;q=0.7
.text/html,application/xhtml+xml;q=1.0,*/*;q=0.7
zu vermeiden, dass fehlerhafte Hosts wie Bitbucket versehentlich Ihren Browser-JSON anstelle von HTML bedienen.Eine schnelle Option ist die Verwendung der MediaTypeMapping-Spezialisierung. Hier ist ein Beispiel für die Verwendung von QueryStringMapping im Application_Start-Ereignis:
Immer wenn die URL in diesem Fall den Querystring? A = b enthält, wird die Json-Antwort im Browser angezeigt.
quelle
Dieser Code macht json zu meiner Standardeinstellung und ermöglicht mir auch die Verwendung des XML-Formats. Ich werde nur die anhängen
xml=true
.Vielen Dank an alle!
quelle
Verwenden Sie Ihren Browser nicht zum Testen Ihrer API.
Versuchen Sie stattdessen, einen HTTP-Client zu verwenden, mit dem Sie Ihre Anforderung angeben können, z. B. CURL oder sogar Fiddler.
Das Problem mit diesem Problem liegt im Client, nicht in der API. Die Web-API verhält sich gemäß der Anforderung des Browsers korrekt.
quelle
Die meisten der oben genannten Antworten sind absolut sinnvoll. Da Daten im XML-Format formatiert werden, bedeutet dies, dass der XML-Formatierer angewendet wird. Sie können also das JSON-Format anzeigen, indem Sie den XMLFormatter wie folgt aus dem Parameter HttpConfiguration entfernen
da JSON das Standardformat ist
quelle
Ich habe einen globalen Aktionsfilter verwendet, um zu entfernen,
Accept: application/xml
wenn derUser-Agent
Header "Chrome" enthält:Scheint zu funktionieren.
quelle
Ich fand die Chrome-App "Advanced REST Client" hervorragend für die Arbeit mit REST-Diensten. Sie können den Inhaltstyp
application/json
unter anderem auf Folgendes einstellen : Erweiterter REST-Clientquelle
Die Rückgabe des richtigen Formats erfolgt durch den Medientyp-Formatierer. Wie bereits erwähnt, können Sie dies in der
WebApiConfig
Klasse tun :Weitere Informationen finden Sie unter:
Wenn Ihre Aktionen XML zurückgeben (was standardmäßig der Fall ist) und Sie nur eine bestimmte Methode benötigen, um JSON zurückzugeben, können Sie eine verwenden
ActionFilterAttribute
und auf diese bestimmte Aktion anwenden.Filterattribut:
Auf die Aktion anwenden:
Beachten Sie, dass Sie das Wort
Attribute
auf der Aktionsdekoration weglassen und[JsonOutput]
stattdessen anstelle von verwenden können[JsonOutputAttribute]
.quelle
quelle
gemäß der neuesten Version von ASP.net WebApi 2,
unter
WebApiConfig.cs
wird dies funktionierenquelle
Mir ist unklar, warum die Antwort all diese Komplexität enthält. Sicher, es gibt viele Möglichkeiten, wie Sie dies mit QueryStrings, Headern und Optionen tun können ... aber was ich für die beste Vorgehensweise halte, ist einfach. Sie fordern eine einfache URL an (z. B. :)
http://yourstartup.com/api/cars
und erhalten dafür JSON. Sie erhalten JSON mit dem richtigen Antwortheader:Auf der Suche nach einer Antwort auf dieselbe Frage fand ich diesen Thread und musste weitermachen, da diese akzeptierte Antwort nicht genau funktioniert. Ich habe eine Antwort gefunden, die meiner Meinung nach einfach zu einfach ist, um nicht die beste zu sein:
Legen Sie den Standard-WebAPI-Formatierer fest
Ich werde auch hier meinen Tipp hinzufügen.
Ich habe eine Frage, woher die Standardeinstellungen (zumindest die, die ich sehe) stammen. Sind sie .NET-Standardeinstellungen oder wurden sie möglicherweise woanders erstellt (von jemand anderem in meinem Projekt)? Ich hoffe, das hilft.
quelle
Hier ist eine Lösung ähnlich der von jayson.centeno und anderen Antworten, jedoch mit der integrierten Erweiterung von
System.Net.Http.Formatting
.Die Lösung war in erster Linie auf die Unterstützung des $ -Formats für OData in den frühen Versionen von WebApi ausgerichtet, gilt jedoch auch für die Nicht-OData-Implementierung und gibt den
Content-Type: application/json; charset=utf-8
Header in der Antwort zurück.Es ermöglicht Ihnen, beim Testen mit einem Browser zu heften
&$format=json
oder&$format=xml
bis zum Ende Ihres Uri. Es beeinträchtigt nicht das andere erwartete Verhalten, wenn Sie einen Nicht-Browser-Client verwenden, in dem Sie Ihre eigenen Header festlegen können.quelle
Sie können wie folgt verwenden:
quelle
Fügen Sie einfach diese beiden Codezeilen zu Ihrer WebApiConfig- Klasse hinzu
quelle
Sie ändern einfach Folgendes
App_Start/WebApiConfig.cs
:quelle
Von MSDN Erstellen einer Einzelseitenanwendung mit ASP.NET und AngularJS (ca. 41 Minuten).
Es sollte aktuell sein, ich habe es versucht und es hat funktioniert.
quelle
Es ist einige Zeit vergangen, seit diese Frage gestellt (und beantwortet) wurde. Eine andere Möglichkeit besteht darin, den Accept-Header auf dem Server während der Anforderungsverarbeitung mithilfe eines MessageHandlers wie folgt zu überschreiben:
Wo
someOtherCondition
kann etwas sein, einschließlich Browsertyp usw. Dies wäre für bedingte Fälle, in denen wir nur manchmal die Standardaushandlung von Inhalten überschreiben möchten. Andernfalls würden Sie gemäß anderen Antworten einfach einen unnötigen Formatierer aus der Konfiguration entfernen.Sie müssen es natürlich registrieren. Sie können dies entweder global tun:
oder auf einer Route für Route Basis:
Und da dies ein Nachrichtenhandler ist, wird er sowohl am Anforderungs- als auch am Antwortende der Pipeline ausgeführt, ähnlich wie bei einem
HttpModule
. So können Sie die Überschreibung leicht mit einem benutzerdefinierten Header bestätigen:quelle
Hier ist der einfachste Weg, den ich in meinen Anwendungen verwendet habe. Fügen Sie die unten angegebenen 3 Codezeilen
App_Start\\WebApiConfig.cs
in dieRegister
Funktion einDie Asp.net-Web-API serialisiert Ihr zurückgegebenes Objekt automatisch in JSON und wenn das
application/json
im Header hinzugefügt wird, wird der Browser oder der Empfänger verstehen, dass Sie das JSON-Ergebnis zurückgeben.quelle
WebApiConfig ist der Ort, an dem Sie konfigurieren können, ob Sie in JSON oder XML ausgeben möchten. Standardmäßig ist es XML. In der Registerfunktion können wir HttpConfiguration Formatters verwenden, um die Ausgabe zu formatieren. System.Net.Http.Headers => MediaTypeHeaderValue ("text / html") ist erforderlich, um die Ausgabe im json-Format abzurufen.
quelle
Mit Felipe Leusin ‚s Antwort jahrelang nach einer letzten Aktualisierung der Kernbibliotheken und von Json.Net, lief ich in ein
System.MissingMethodException
: SupportedMediaTypes. Die Lösung in meinem Fall, die hoffentlich für andere hilfreich ist, bei denen dieselbe unerwartete Ausnahme auftritt, ist die InstallationSystem.Net.Http
. NuGet entfernt es anscheinend unter bestimmten Umständen. Nach einer manuellen Installation wurde das Problem behoben.quelle
Ich bin erstaunt zu sehen, dass so viele Antworten eine Codierung erfordern, um einen einzelnen Anwendungsfall (GET) in einer API zu ändern, anstatt ein geeignetes Tool zu verwenden, das einmal installiert werden muss und für jede API (eigene oder Drittanbieter) und alle verwendet werden kann Anwendungsfälle.
Die gute Antwort lautet also:
quelle