Ich suche nach dem richtigen Weg, um JSON mit einem HTTP-Statuscode in meinem .NET Core Web API-Controller zurückzugeben. Ich benutze es so:
public IHttpActionResult GetResourceData()
{
return this.Content(HttpStatusCode.OK, new { response = "Hello"});
}
Dies war in einer 4.6 MVC-Anwendung, aber jetzt mit .NET Core habe ich anscheinend nicht das, was IHttpActionResult
ich habe ActionResult
und benutze es wie folgt:
public ActionResult IsAuthenticated()
{
return Ok(Json("123"));
}
Aber die Antwort vom Server ist seltsam, wie im Bild unten:
Ich möchte nur, dass der Web-API-Controller JSON mit einem HTTP-Statuscode zurückgibt, wie ich es in Web-API 2 getan habe.
c#
json
asp.net-core
asp.net-core-webapi
Rossco
quelle
quelle
CreatedAtRoute
Methode usw.Antworten:
Die grundlegendste Version, die mit a antwortet,
JsonResult
ist:Dies hilft jedoch nicht bei Ihrem Problem, da Sie Ihren eigenen Antwortcode nicht explizit behandeln können.
beispielsweise:
Beachten Sie, dass diese beiden obigen Beispiele aus einem großartigen Handbuch stammen, das in der Microsoft-Dokumentation verfügbar ist: Formatieren von Antwortdaten
Extra Zeug
Das Problem, auf das ich häufig stoße, ist, dass ich eine detailliertere Kontrolle über meine WebAPI haben wollte, anstatt nur die Standardkonfiguration aus der Vorlage "Neues Projekt" in VS zu verwenden.
Lassen Sie uns sicherstellen, dass Sie einige der Grundlagen haben ...
Schritt 1: Konfigurieren Sie Ihren Service
Damit Ihre ASP.NET Core-WebAPI mit einem JSON Serialized Object unter vollständiger Kontrolle des Statuscodes antwortet, sollten Sie zunächst sicherstellen, dass Sie den
AddMvc()
Dienst in IhreConfigureServices
normalerweise in enthaltene Methode aufgenommen habenStartup.cs
.Wenn für Ihr Projekt die vollständige Kontrolle erforderlich ist und Sie Ihre Dienste genau definieren möchten, z. B. wie sich Ihre WebAPI gegenüber verschiedenen Anforderungstypen verhält, einschließlich
application/json
und nicht auf andere Anforderungstypen (z. B. eine Standardbrowseranforderung), können Sie diese manuell mit dem definieren folgenden Code:Sie werden feststellen, dass ich Ihnen auch eine Möglichkeit hinzugefügt habe, Ihre eigenen benutzerdefinierten Eingabe- / Ausgabeformatierer hinzuzufügen, falls Sie auf ein anderes Serialisierungsformat (Protobuf, Sparsamkeit usw.) reagieren möchten.
Der obige Codeabschnitt ist meistens ein Duplikat der
AddMvc()
Methode. Wir implementieren jedoch jeden "Standard" -Dienst für sich, indem wir jeden einzelnen Dienst definieren, anstatt den vorab ausgelieferten mit der Vorlage zu verwenden. Ich habe den Repository-Link in den Codeblock eingefügt, oder Sie könnenAddMvc()
aus dem GitHub-Repository auschecken. .Beachten Sie, dass es einige Anleitungen gibt, die versuchen, dieses Problem zu lösen, indem sie die Standardeinstellungen "rückgängig machen", anstatt sie erst gar nicht zu implementieren. Wenn Sie berücksichtigen, dass wir jetzt mit Open Source arbeiten, ist dies redundante Arbeit , schlechter Code und ehrlich gesagt eine alte Angewohnheit, die bald verschwinden wird.
Schritt 2: Erstellen Sie einen Controller
Ich werde Ihnen eine wirklich einfache zeigen, nur um Ihre Frage zu sortieren.
Schritt 3: Überprüfen Sie Ihre
Content-Type
undAccept
Sie müssen sicherstellen, dass Ihre
Content-Type
und dieAccept
Header in Ihrer Anfrage richtig eingestellt sind. In Ihrem Fall (JSON) möchten Sie es so einrichtenapplication/json
.Wenn Sie möchten, dass Ihre WebAPI standardmäßig als JSON antwortet, können Sie dies auf verschiedene Arten tun, unabhängig davon, was im Anforderungsheader angegeben ist .
Weg 1 Wie in dem zuvor empfohlenen Artikel ( Formatieren von Antwortdaten ) gezeigt, können Sie ein bestimmtes Format auf Controller- / Aktionsebene erzwingen. Ich persönlich mag diesen Ansatz nicht ... aber hier ist er der Vollständigkeit halber:
Weg 2 Meine bevorzugte Methode ist, dass die WebAPI auf alle Anforderungen mit dem angeforderten Format antwortet. Falls das angeforderte Format jedoch nicht akzeptiert wird, greifen Sie zurück einen Standard zurück (z. B. JSON).
Zuerst müssen Sie dies in Ihren Optionen registrieren (wir müssen das Standardverhalten, wie bereits erwähnt, überarbeiten).
Schließlich ordnet der Webhost durch einfaches Neuordnen der Liste der Formatierer, die im Service Builder definiert wurden, standardmäßig den Formatierer an, den Sie oben in der Liste positionieren (dh Position 0).
Weitere Informationen finden Sie in diesem Blogeintrag zu .NET Web Development and Tools
quelle
IActionResult
mit demreturn Ok(new {response = "123"});
Jubel umzusetzen !RespectBrowserAcceptHeader
ist dies wichtig, wenn Sie die Verwendung eines alternativen Serializers implementieren oder häufiger, wenn Sie sicherstellen möchten, dass Ihre Clients keine fehlerhaften Anforderungen senden. Daher habe ich betont, "Wenn Ihr Projekt die volle Kontrolle erfordert und Sie Ihren Service genau definieren möchten", und das hervorgehobene Blockzitat auch über dieser Aussage notiert.Sie haben vordefinierte Methoden für die meisten gängigen Statuscodes.
Ok(result)
kehrt200
mit Antwort zurückCreatedAtRoute
Gibt201
+ neue Ressourcen-URL zurückNotFound
kehrt zurück404
BadRequest
Rückgabe400
etc.Siehe
BaseController.cs
undController.cs
für eine Liste aller Methoden.Wenn Sie jedoch wirklich darauf bestehen, dass Sie
StatusCode
einen benutzerdefinierten Code festlegen können, sollten Sie dies jedoch nicht tun, da dies den Code weniger lesbar macht und Sie den Code wiederholen müssen, um Header festzulegen (wie zCreatedAtRoute
. B. für ).quelle
JSON
dieActionResult
von derJson()
Methode erstellte. Die Zeichenfolge "123" ist nicht direkt enthalten.Json(...)
und übergeben Sie die Zeichenfolge anStatusCode
Mit ASP.NET Core 2.0 ist der ideale Weg, um ein Objekt zurückzugeben
Web API
(das mit MVC vereinheitlicht ist und dieselbe Basisklasse verwendetController
)Beachte das
200 OK
Statuscode zurückgegeben (es ist eineOk
Art vonObjectResult
)Accept
angeforderten Header zurückgegeben. WennAccept: application/xml
eine Anfrage gesendet wird, wird diese als zurückgegebenXML
. Wenn nichts gesendet wird,JSON
ist dies Standard.Wenn es mit einem bestimmten Statuscode senden muss , verwenden Sie
ObjectResult
oderStatusCode
stattdessen. Beide machen dasselbe und unterstützen die Aushandlung von Inhalten.oder noch feiner mit ObjectResult:
Wenn Sie speziell als JSON zurückkehren möchten , gibt es mehrere Möglichkeiten
Beachte das
JSON
auf zwei verschiedene Arten.Json(object)
.Produces()
Attribut (das a istResultFilter
) mit verwendetcontentType = application/json
Lesen Sie mehr darüber in den offiziellen Dokumenten . Erfahren Sie hier mehr über Filter .
Die einfache Modellklasse, die in den Beispielen verwendet wird
quelle
Der einfachste Weg, den ich gefunden habe, ist:
quelle
Dies ist meine einfachste Lösung:
oder
quelle
Anstatt 404/201 Statuscodes mit enum zu verwenden
quelle
Tolle Antworten, die ich hier gefunden habe und ich habe auch versucht, diese Rückgabeerklärung zu sehen
StatusCode(whatever code you wish)
und es hat funktioniert !!!quelle
Bitte beziehen Sie sich auf den folgenden Code. Sie können mehrere Statuscodes mit unterschiedlichem JSON-Typ verwalten
quelle
In meinen Asp Net Core Api-Anwendungen erstelle ich eine Klasse, die von ObjectResult ausgeht und viele Konstruktoren zum Anpassen des Inhalts und des Statuscodes bereitstellt. Dann verwenden alle meine Controller-Aktionen einen der Kostenleiter als geeignet. Sie können sich meine Implementierung unter folgender Adresse ansehen: https://github.com/melardev/AspNetCoreApiPaginnedCrud
und
https://github.com/melardev/ApiAspCoreEcommerce
So sieht die Klasse aus (den vollständigen Code finden Sie in meinem Repo):
Beachten Sie die Basis (dto), die Sie durch Ihr Objekt ersetzen, und Sie sollten bereit sein, loszulegen.
quelle
Ich habe das zum Laufen gebracht. Mein großes Problem war, dass mein JSON eine Zeichenfolge war (in meiner Datenbank ... und kein bestimmter / bekannter Typ).
Ok, ich habe das endlich zum Laufen gebracht.
Ich bin zufällig auf asp.net Core 3.1
Ich habe den Hinweis von hier bekommen: https://www.jianshu.com/p/7b3e92c42b61
quelle