Ich versuche herauszufinden, welcher Statuscode für verschiedene Szenarien mit einer "REST-ähnlichen" API, an der ich arbeite, der richtige ist. Angenommen, ich habe einen Endpunkt, der das POST-Kaufen im JSON-Format ermöglicht. Es sieht aus wie das:
{
"account_number": 45645511,
"upc": "00490000486",
"price": 1.00,
"tax": 0.08
}
Was soll ich zurückgeben, wenn der Kunde mir "sales_tax" sendet (anstelle der erwarteten "Steuer")? Derzeit gebe ich eine 400 zurück. Aber ich habe angefangen, mich dazu zu befragen. Sollte ich wirklich eine 422 zurückgeben? Ich meine, es ist JSON (das unterstützt wird) und es ist gültiges JSON, es enthält einfach nicht alle erforderlichen Felder.
rest
http-status-codes
David S.
quelle
quelle
Antworten:
400 Bad Request scheint nun der beste HTTP / 1.1-Statuscode für Ihren Anwendungsfall zu sein.
Zum Zeitpunkt Ihrer Frage (und meiner ursprünglichen Antwort) war RFC 7231 keine Sache. An diesem Punkt habe ich Einwände erhoben,
400 Bad Request
weil RFC 2616 sagte (mit Schwerpunkt auf meinem):und die von Ihnen beschriebene Anforderung ist syntaktisch gültiges JSON, das in syntaktisch gültigem HTTP eingeschlossen ist, und daher hat der Server keine Probleme mit der Syntax der Anforderung.
Wie Lee Saferite in den Kommentaren hervorhob , enthält RFC 7231, das RFC 2616 überholt, diese Einschränkung jedoch nicht :
Doch vor dieser Umformulierung (oder , wenn Sie über RFC 7231 nur Wortklauberei wollen ein Wesen vorgeschlagen Standard jetzt),
422 Unprocessable Entity
scheint nicht einen falschen HTTP - Statuscode für Ihren Anwendungsfall, denn wie die Einführung in RFC 4918 sagt:Und die Beschreibung von
422
sagt:(Beachten Sie den Verweis auf die Syntax; ich vermute, dass 7231 auch 4918 teilweise überholt hat)
Das klingt genau nach Ihrer Situation, aber für den Fall, dass Zweifel bestehen, heißt es weiter:
(Ersetzen Sie "XML" durch "JSON" und ich denke, wir können uns darauf einigen, dass dies Ihre Situation ist.)
Einige werden nun einwenden, dass es in RFC 4918 um "HTTP-Erweiterungen für das verteilte Web-Authoring und -Versionierung (WebDAV)" geht und dass Sie (vermutlich) nichts mit WebDAV zu tun haben und daher keine Dinge daraus verwenden sollten.
Angesichts der Wahl zwischen der Verwendung eines Fehlercodes im ursprünglichen Standard, der die Situation ausdrücklich nicht abdeckt, und eines aus einer Erweiterung, die die Situation genau beschreibt, würde ich letzteren wählen.
Darüber hinaus bezieht sich RFC 4918, Abschnitt 21.4, auf die HTTP-Statuscode-Registrierung (IANA Hypertext Transfer Protocol) , in der 422 zu finden ist.
Ich schlage vor, dass es für einen HTTP-Client oder -Server völlig vernünftig ist, einen Statuscode aus dieser Registrierung zu verwenden, sofern dies korrekt ist.
Aber ab HTTP / 1.1 hat RFC 7231 Traktion, also einfach verwenden
400 Bad Request
!quelle
400 Bad Request ist der richtige HTTP-Statuscode für Ihren Anwendungsfall. Der Code wird durch HTTP / 0.9-1.1 RFC definiert.
http://tools.ietf.org/html/rfc2616#section-10.4.1
422 Nicht verarbeitbare Entität wird von RFC 4918 - WebDav definiert. Beachten Sie, dass es im Vergleich zu 400 einen geringfügigen Unterschied gibt, siehe unten zitierten Text.
Um eine einheitliche Benutzeroberfläche zu erhalten, sollten Sie 422 nur bei XML-Antworten verwenden und alle Statuscodes unterstützen, die durch die Webdav-Erweiterung definiert sind, nicht nur 422.
http://tools.ietf.org/html/rfc4918#page-78
Siehe auch Mark Nottinghams Beitrag zu Statuscodes:
Wie man über HTTP-Statuscodes nachdenkt
quelle
The following status codes are added to those defined in HTTP/1.1 [RFC2616].
Um den Status ab 2015 widerzuspiegeln:
Verhaltensmäßig werden sowohl 400 als auch 422 Antwortcodes von Kunden und Vermittlern gleich behandelt, sodass es keinen konkreten Unterschied macht, den Sie verwenden.
Ich würde jedoch erwarten, dass 400 derzeit in größerem Umfang verwendet werden, und die Klarstellungen, die die HTTPbis-Spezifikation enthält, machen sie außerdem zu einem der beiden Statuscodes:
Für den Kontext ist HTTPbis eine Überarbeitung der HTTP / 1.1-Spezifikation, mit der versucht wird, Bereiche zu klären, die unklar oder inkonsistent sind. Sobald der genehmigte Status erreicht ist, wird RFC2616 ersetzt.
quelle
Fallstudie: GitHub API
https://developer.github.com/v3/#client-errors
Vielleicht ist das Kopieren von bekannten APIs eine kluge Idee:
quelle
Es gibt keine richtige Antwort, da dies davon abhängt, wie die Definition von "Syntax" für Ihre Anfrage lautet. Das Wichtigste ist, dass Sie:
Bevor alle über mich hinwegspringen, weil sie sagen, dass es hier keine richtige oder falsche Antwort gibt, möchte ich kurz erläutern, wie ich zu dem Schluss gekommen bin.
In diesem speziellen Beispiel handelt es sich bei der Frage des OP um eine JSON-Anforderung, die einen anderen Schlüssel als erwartet enthält. Nun ist der empfangene Schlüsselname vom Standpunkt der natürlichen Sprache dem erwarteten Schlüssel sehr ähnlich, aber er unterscheidet sich streng und wird daher (normalerweise) von einer Maschine nicht als gleichwertig erkannt.
Wie ich oben sagte, ist der entscheidende Faktor, was unter Syntax zu verstehen ist . Wenn die Anforderung mit einem Inhaltstyp von gesendet wurde
application/json
, ist die Anforderung syntaktisch gültig, da sie eine gültige JSON-Syntax hat, jedoch nicht semantisch gültig, da sie nicht den Erwartungen entspricht. (unter der Annahme einer strengen Definition dessen, was die betreffende Anfrage semantisch gültig macht oder nicht).Wenn andererseits die Anfrage mit einem spezifischeren benutzerdefinierten Inhaltstyp gesendet wurde
application/vnd.mycorp.mydatatype+json
, der möglicherweise genau angibt, welche Felder erwartet werden, würde ich sagen, dass die Anfrage leicht syntaktisch ungültig sein könnte, daher die 400-Antwort.In dem Fall , in Frage, da der Schlüssel nicht in Ordnung war, nicht der Wert , gab es einen Syntaxfehler , wenn es eine Spezifikation war für das, was gültige Schlüssel. Wenn es keine Spezifikation für gültige Schlüssel gäbe oder der Fehler einen Wert hätte , wäre dies ein semantischer Fehler.
quelle
https://www.keycdn.com/support/422-unprocessable-entity/
quelle
Ihr Fall:
HTTP 400
ist der richtige Statuscode für Ihren Fall von REST Perspektive als syntaktisch falsch zu senden ,sales_tax
anstatttax
obwohl seine einer gültigen JSON. Dies wird normalerweise von den meisten serverseitigen Frameworks erzwungen, wenn der JSON Objekten zugeordnet wird. Es gibt jedoch einige REST-Implementierungen, die neuekey
JSON-Objekte ignorieren . In diesem Fall kann eine benutzerdefiniertecontent-type
Spezifikation, die nur gültige Felder akzeptiert, serverseitig erzwungen werden.Ideales Szenario für 422:
In einer idealen Welt wird 422 bevorzugt und im Allgemeinen als Antwort gesendet, wenn der Server den Inhaltstyp der Anforderungsentität versteht und die Syntax der Anforderungsentität korrekt ist, die Daten jedoch aufgrund ihrer semantischen Fehler nicht verarbeiten konnte.
Situationen von 400 über 422:
Denken Sie daran, dass der Antwortcode 422 ein erweiterter HTTP-Statuscode (WebDAV) ist. Es gibt immer noch einige HTTP-Clients / Front-End-Bibliotheken, die nicht für 422 vorbereitet sind. Für sie ist es so einfach wie "HTTP 422 ist falsch, weil es kein HTTP ist" . Aus Service-Sicht ist 400 nicht ganz spezifisch.
In der Unternehmensarchitektur werden die Dienste hauptsächlich auf Serviceebenen wie SOA, IDM usw. bereitgestellt. Sie bedienen normalerweise mehrere Clients, von einem sehr alten nativen Client bis zu einem neuesten HTTP-Client. Wenn einer der Clients nicht mit HTTP 422 umgehen kann, können Sie den Client auffordern, Ihren Antwortcode für alle Benutzer zu aktualisieren oder in HTTP 400 zu ändern. Nach meiner Erfahrung ist dies heutzutage sehr selten, aber immer noch eine Möglichkeit. Daher ist immer eine sorgfältige Untersuchung Ihrer Architektur erforderlich, bevor Sie sich für die HTTP-Antwortcodes entscheiden.
Um mit solchen Situationen fertig zu werden, verwenden die Service-Layer normalerweise das Flag
versioning
oder Setupconfiguration
für strikte HTTP-Konformitäts-Clients, um 400 und 422 für den Rest von ihnen zu senden. Auf diese Weise bieten sie Unterstützung für Abwärtskompatibilität für vorhandene Verbraucher, bieten aber gleichzeitig den neuen Clients die Möglichkeit, HTTP 422 zu verwenden.Das neueste Update für RFC7321 lautet:
Dies bestätigt, dass Server HTTP 400 für eine ungültige Anforderung senden können. 400 bezieht sich nicht mehr nur auf Syntaxfehler , 422 ist jedoch immer noch eine echte Antwort, vorausgesetzt, die Clients können damit umgehen.
quelle
Erstens ist dies eine sehr gute Frage.
400 Bad Request - Wenn eine kritische Information in der Anfrage fehlt
zB Der Autorisierungsheader oder der Inhaltstypheader. Was vom Server unbedingt benötigt wird, um die Anfrage zu verstehen. Dies kann von Server zu Server unterschiedlich sein.
422 Nicht verarbeitbare Entität - Wenn der Anforderungshauptteil nicht analysiert werden kann.
Dies ist weniger schwerwiegend als 400. Die Anforderung hat den Server erreicht. Der Server hat bestätigt, dass die Anforderung die richtige Grundstruktur aufweist. Die Informationen im Anforderungshauptteil können jedoch nicht analysiert oder verstanden werden.
zB
Content-Type: application/xml
wenn der Anfragetext JSON ist.In diesem Artikel werden Statuscodes und ihre Verwendung in REST-APIs aufgelistet. https://metamug.com/article/status-codes-for-rest-api.php
quelle
Sie sollten tatsächlich "200 OK" zurückgeben und im Antworttext eine Nachricht darüber einfügen, was mit den veröffentlichten Daten passiert ist. Dann liegt es an Ihrer Anwendung, die Nachricht zu verstehen.
Die Sache ist, HTTP-Statuscodes sind genau das - HTTP-Statuscodes. Und diese sollen nur auf der Transportschicht eine Bedeutung haben, nicht auf der Anwendungsschicht. Die Anwendungsschicht sollte eigentlich nie wissen, dass HTTP verwendet wird. Wenn Sie Ihre Transportschicht von HTTP auf Brieftauben umgestellt haben, sollte dies keine Auswirkungen auf Ihre Anwendungsschicht haben.
Lassen Sie mich Ihnen ein nicht virtuelles Beispiel geben. Nehmen wir an, Sie verlieben sich in ein Mädchen und sie liebt Sie zurück, aber ihre Familie zieht in ein ganz anderes Land. Sie gibt dir ihre neue Postanschrift. Natürlich beschließen Sie, ihr einen Liebesbrief zu schicken. Also schreiben Sie Ihren Brief, stecken ihn in einen Umschlag, schreiben ihre Adresse auf den Umschlag, stempeln ihn ab und senden ihn ab. Betrachten wir nun diese Szenarien
Kurz gesagt: Die Rückgabe von "200 OK" bedeutet nicht, dass die Server-App gute Nachrichten für Sie hat. Es bedeutet nur, dass es einige Neuigkeiten gibt.
PS: Der 422-Statuscode hat nur im Kontext von WebDAV eine Bedeutung. Wenn Sie nicht mit WebDAV arbeiten, hat 422 genau die gleiche Standardbedeutung wie jeder andere nicht standardmäßige Code = der keine ist.
quelle