400 vs 422 Antwort auf POST von Daten

Ich versuche herauszufinden, wie der richtige Statuscode in verschiedenen Szenarien mit einer “REST-ähnlichen” API zurückgegeben wird, an der ich gerade arbeite. Nehmen wir an, ich habe einen Endpunkt, der POST-Einkäufe 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” (statt der erwarteten “Steuer”) schickt? Momentan gebe ich eine 400 zurück. Aber ich habe mich damit selbst in Frage gestellt. Sollte ich wirklich eine 422 zurückgeben? Ich meine, es ist JSON (was unterstützt wird) und es ist gültig JSON, es enthält nur nicht alle erforderlichen Felder.

400 Bad Request scheint jetzt der beste HTTP / 1.1-Statuscode für Ihren Anwendungsfall zu sein.

Zur Zeit Ihrer Frage (und meiner ursprünglichen Antwort) war RFC 7231 keine Sache; An dieser Stelle widersprach ich 400 Bad Request weil RFC 2616 (mit Schwerpunkt meiner) sagte:

Die Anfrage konnte vom Server aufgrund einer errorshaften Syntax nicht verstanden werden.

und die Anforderung, die Sie beschreiben, ist syntaktisch gültige JSON, die in syntaktisch gültiges HTTP eingebettet ist, und somit hat der Server keine Probleme mit der Syntax der Anforderung.

Wie jedoch von Lee Saferite in den Kommentaren ausgeführt , enthält RFC 7231, das RFC 2616 veraltet, diese Einschränkung nicht :

Der Statuscode 400 (Bad Request) zeigt an, dass der Server die Anforderung aufgrund eines als Clienterrors wahrgenommenen Fehlers nicht verarbeiten kann oder wird (z. B. errorshafte Syntax der Syntax, Rahmen der ungültigen Anforderungsnachricht oder Routing der irreführenden Anforderung).


Vor dieser Neubenennung (oder wenn Sie über RFC 7231 nur als Vorschlag für einen Standard reklamieren möchten) scheint 422 Unprocessable Entity jedoch kein falscher HTTP-Statuscode für Ihren Anwendungsfall zu sein, denn als Einführung in RFC 4918 sagt:

Während die Statuscodes, die von HTTP / 1.1 bereitgestellt werden, ausreichen, um die meisten Fehlerbedingungen zu beschreiben, die von WebDAV-Methoden angetroffen werden, gibt es einige Fehler, die nicht sauber in die vorhandenen Kategorien fallen. Diese Spezifikation definiert zusätzliche Statuscodes, die für WebDAV-Methoden entwickelt wurden (Abschnitt 11).

Und die Beschreibung von 422 sagt:

Der Statuscode 422 (Unprocessable Entity) bedeutet, dass der Server den Inhaltstyp der Anforderungseinheit versteht (daher ist ein 415 (Nicht unterstützter Medientyp) – Statuscode ungeeignet), und die Syntax der Anforderungseinheit ist korrekt (also 400 (Ungültige Anforderung) Der Statuscode ist nicht geeignet), konnte die enthaltenen statementen jedoch nicht verarbeiten.

(Beachten Sie den Hinweis auf die Syntax; ich vermute 7231 teilweise obsoletes 4918 auch)

Das klingt genau nach deiner Situation, aber für den Fall, dass Zweifel bestehen, heißt es weiter:

Diese Fehlerbedingung kann beispielsweise auftreten, wenn ein XML-Anfragetext wohlgeformte (dh syntaktisch korrekte), aber semantisch errorshafte XML-statementen enthält.

(Ersetzen Sie “XML” durch “JSON” und ich denke, wir können zustimmen, dass dies Ihre Situation ist)

Nun werden einige einwenden, dass es in RFC 4918 um “HTTP Extensions für Web Distributed Authoring und Versioning (WebDAV)” geht und dass Sie (vermutlich) nichts mit WebDAV machen, also sollten Sie keine Dinge daraus verwenden.

Angesichts der Wahl zwischen der Verwendung eines Fehlercodes im ursprünglichen Standard, der die Situation explizit nicht erfasst, und einer Erweiterung, die die Situation genau beschreibt, würde ich die letztere wählen.

Darüber hinaus verweist RFC 4918 Abschnitt 21.4 auf die HTTP-Statuscode-Registrierung des IANA-Hypertext-Transfer-Protokolls , wo 422 gefunden werden kann.

Ich schlage vor, dass es für einen HTTP-Client oder -Server absolut vernünftig ist, jeden Statuscode aus dieser Registrierung zu verwenden, solange sie dies korrekt tun.


Aber seit HTTP / 1.1 hat RFC 7231 Traktion, also verwenden Sie einfach 400 Bad Request !

Um den Stand von 2015 widerzuspiegeln:

Verhaltensweise werden sowohl die 400 als auch die 422 Antwortcodes von Kunden und Vermittlern gleich behandelt, so dass sie tatsächlich keinen konkreten Unterschied ausmachen, den Sie verwenden.

Allerdings würde ich erwarten, dass 400 derzeit häufiger verwendet wird, und außerdem machen die Klarstellungen, die die HTTPbis-Spezifikation bereitstellt, die geeigneteren der beiden Statuscodes:

  • Die HTTPbis-Spezifikation verdeutlicht die Absicht von 400, nicht ausschließlich für Syntaxerrors zu sorgen. Der breitere Ausdruck “zeigt an, dass der Server die Anfrage aufgrund eines als Client-Fehler wahrgenommenen Fehlers nicht verarbeiten kann oder wird” wird nun verwendet.
  • 422 ist speziell eine WebDAV-Erweiterung und wird nicht in RFC 2616 oder in der neueren HTTPbis-Spezifikation referenziert .

Für Kontext ist HTTPbis eine Revision der HTTP / 1.1-Spezifikation, die Bereiche zu klären versucht, die unklar oder inkonsistent waren. Sobald es den genehmigten Status erreicht hat, wird es RFC2616 ersetzen.

400 Bad Request ist der korrekte HTTP-Statuscode für Ihren Anwendungsfall. Der Code wird durch HTTP / 0.9-1.1 RFC definiert.

Die Anfrage konnte vom Server aufgrund einer errorshaften Syntax nicht verstanden werden. Der Kunde sollte die Anfrage nicht ohne Änderungen wiederholen.

http://tools.ietf.org/html/rfc2616#section-10.4.1

422 Unprocessable Entity ist durch RFC 4918 – WebDav definiert. Beachten Sie, dass es einen kleinen Unterschied im Vergleich zu 400 gibt, siehe zitierten Text unten.

Diese Fehlerbedingung kann auftreten, wenn ein XML-Anfragetext wohlgeformte (dh syntaktisch korrekte), aber semantisch errorshafte XML-statementen enthält.

Um eine einheitliche Oberfläche zu erhalten, sollten Sie 422 nur im Fall von XML-Antworten verwenden, und Sie sollten auch alle Statuscodes unterstützen, die von der Webdav-Erweiterung definiert werden, nicht nur von 422.

http://tools.ietf.org/html/rfc4918#page-78

Siehe auch Mark Nottinghams Beitrag zu Statuscodes:

Es ist ein Fehler zu versuchen, jeden Teil Ihrer Anwendung “tief” in HTTP-Statuscodes zu mappen; In den meisten Fällen ist das Granularitätsniveau, das Sie anstreben, viel gröber. Im Zweifelsfall ist es in Ordnung, die generischen Statuscodes 200 OK, 400 Bad Request und 500 Internal Service Error zu verwenden, wenn keine bessere Anpassung vorliegt .

So denken Sie über HTTP-Statuscodes nach

Es gibt keine richtige Antwort, da es darauf ankommt, was die Definition von “Syntax” für Ihre Anfrage ist. Das Wichtigste ist, dass Sie:

  1. Verwenden Sie den / die Antwortcode (s) konsistent
  2. Fügen Sie so viele zusätzliche Informationen in den Antworttext ein, wie Sie den Entwicklern, die Ihre API verwenden, helfen können, herauszufinden, was vor sich geht

Bevor jeder über mich hinwegspringt, um zu sagen, dass es hier keine richtige oder falsche Antwort gibt, möchte ich ein wenig erklären, wie ich zu dem Schluss gekommen bin.

In diesem speziellen Beispiel bezieht sich die Frage des OP auf eine JSON-Anfrage, die einen anderen Schlüssel als erwartet enthält. Nun ist der empfangene Schlüsselname vom Standpunkt der natürlichen Sprache zum erwarteten Schlüssel sehr ähnlich, aber er ist streng anders und wird daher von einer Maschine (normalerweise) nicht als gleichwertig erkannt.

Wie ich oben sagte, ist der entscheidende Faktor, was mit Syntax gemeint ist. Wenn die Anfrage mit einem Inhaltstyp der application/json gesendet wurde, dann ist die Anfrage syntaktisch gültig, da sie eine gültige JSON-Syntax, aber nicht semantisch gültig ist, da sie nicht mit den erwarteten Ergebnissen übereinstimmt. (unter der Annahme einer strikten Definition dessen, was die fragliche Anfrage semantisch gültig macht oder nicht).

Wenn andererseits die Anfrage mit einem spezifischeren benutzerdefinierten Inhaltstyp wie application/vnd.mycorp.mydatatype+json wurde, der vielleicht genau angibt, welche Felder erwartet werden, würde ich sagen, dass die Anfrage leicht syntaktisch sein könnte ungültig, daher die 400 Antwort.

In dem Fall, in dem der Schlüssel falsch war, nicht der Wert , gab es einen Syntaxerrors , wenn es eine Spezifikation gab, was gültige Schlüssel sind. Wenn es keine Spezifikation für gültige Schlüssel gab oder der Fehler mit einem Wert verbunden war , dann wäre dies ein semantischer Fehler.

Erstens ist das eine sehr gute Frage.

400 Ungültige Anforderung – Wenn eine kritische Information in der Anforderung fehlt

z. B. den Autorisierungsheader oder den Inhaltstypheader. Was vom Server unbedingt benötigt wird, um die Anfrage zu verstehen. Dies kann von Server zu Server unterschiedlich sein.

422 Unprocessable Entity – Wenn der Anfragetext nicht geparst werden kann.

Dies ist weniger streng als 400. Die Anfrage hat den Server erreicht. Der Server hat bestätigt, dass die Anfrage die grundlegende Struktur richtig hat. Aber die Informationen im Anfragetext können nicht geparst oder verstanden werden.

zB Content-Type: application/xml wenn der Content-Type: application/xml JSON ist.

In diesem Artikel werden Statuscodes und ihre Verwendung in REST-APIs aufgelistet. https://metamug.com/article/status-codes-for-rest-api.php

422 Unverfügbare Entität erklärt Aktualisiert: 6. März 2017

Was ist 422 nicht verarbeitbare Entität?

Ein 422-Statuscode tritt auf, wenn eine Anforderung wohlgeformt ist, aufgrund semantischer Fehler jedoch nicht verarbeitet werden kann. Dieser HTTP-Status wurde in RFC 4918 eingeführt und ist speziell auf HTTP-Erweiterungen für Web Distributed Authoring und Versioning (WebDAV) ausgerichtet.

Es gibt einige Kontroversen darüber, ob Entwickler einen 400 vs 422-Fehler an Clients zurückgeben sollten (mehr zu den Unterschieden zwischen den beiden Status unten). In den meisten Fällen wird jedoch vereinbart, dass der Status 422 nur zurückgegeben werden soll, wenn Sie die WebDAV-functionen unterstützen.

Eine Wort-für-Wort-Definition des 422-Statuscodes aus Abschnitt 11.2 in RFC 4918 kann unten gelesen werden.

Der Statuscode 422 (Unprocessable Entity) bedeutet, dass der Server den Inhaltstyp der Anforderungseinheit versteht (daher ist ein 415 (Nicht unterstützter Medientyp) – Statuscode ungeeignet), und die Syntax der Anforderungseinheit ist korrekt (also 400 (Ungültige Anforderung) Der Statuscode ist nicht geeignet), konnte die enthaltenen statementen jedoch nicht verarbeiten.

Die Definition fährt fort zu sagen:

Diese Fehlerbedingung kann beispielsweise auftreten, wenn ein XML-Anfragetext wohlgeformte (dh syntaktisch korrekte), aber semantisch errorshafte XML-statementen enthält.

400 vs 422 Statuscodes

Fehlerhafte Anforderungserrors verwenden den 400-Statuscode und sollten an den Client zurückgegeben werden, wenn die Anforderungssyntax errorshaft ist, ungültige Framefragmente für Anforderungsnachrichten enthalten oder ein irreführendes Anforderungsrouting vorliegt. Dieser Statuscode mag dem 422-Status der nicht verarbeitbaren Entität ziemlich ähnlich erscheinen, eine kleine Information, die sie unterscheidet, ist jedoch die Tatsache, dass die Syntax einer Request-Entity für einen 422-Fehler korrekt ist, während die Syntax einer Anfrage eine 400 generiert Fehler ist falsch.

Die Verwendung des Status 422 sollte nur für ganz bestimmte Anwendungsfälle reserviert werden. In den meisten anderen Fällen, in denen aufgrund einer errorshaften Syntax ein Clienterrors aufgetreten ist, sollte der Status 400 Bad Request verwendet werden.

https://www.keycdn.com/support/422-unprocessable-entity/

Ihr Fall: HTTP 400 ist der richtige Statuscode für Ihren Fall aus REST-Perspektive, da er syntaktisch falsch ist, um sales_tax anstelle von tax zu senden, obwohl es ein gültiger JSON ist. Dies wird normalerweise von den meisten serverseitigen Frameworks erzwungen, wenn das JSON Objekten zugeordnet wird. Es gibt jedoch einige REST-Implementierungen, die den neuen key im JSON-Objekt ignorieren. In diesem Fall kann eine benutzerdefinierte content-type , die nur gültige Felder akzeptiert, serverseitig erzwungen werden.

Ideales Szenario für 422:

In einer idealen Welt ist 422 bevorzugt und allgemein akzeptabel, um als Antwort zu senden, wenn der Server den Inhaltstyp der Anfrageeinheit versteht und die Syntax der Anfrageeinheit korrekt ist, aber nicht in der Lage war, die Daten zu verarbeiten, weil sie semantisch errorshaft ist.

Situationen von 400 über 422:

Denken Sie daran, dass der Antwortcode 422 ein erweiterter HTTP (WebDAV) Statuscode ist. Es gibt immer noch einige HTTP-Clients / Frontend-Bibliotheken, die nicht für die Verarbeitung von 422 vorbereitet sind. Für sie ist es so einfach wie “HTTP 422 ist falsch, weil es nicht HTTP ist” . Aus der Service-Perspektive ist 400 nicht ganz spezifisch.

In der Unternehmensarchitektur werden die Dienste hauptsächlich auf Service-Layern wie SOA, IDM usw. eingesetzt. Sie dienen in der Regel mehreren Clients, die von einem sehr alten nativen Client bis zu einem aktuellen HTTP-Client reichen. Wenn einer der Clients HTTP 422 nicht verarbeitet, besteht die Option darin, den Client aufzufordern, den Antwortcode für alle Benutzer auf HTTP 400 zu aktualisieren oder zu ändern. Nach meiner Erfahrung ist dies heutzutage sehr selten, aber immer noch eine Möglichkeit. Daher ist immer ein sorgfältiges Studium Ihrer Architektur erforderlich, bevor Sie sich für die HTTP-Antwortcodes entscheiden.

Um mit einer solchen Situation umgehen zu können, verwenden die Service-Layer normalerweise versioning oder Setup- configuration für Clients mit strenger HTTP-Konformität, um 400 zu senden und 422 für den Rest von ihnen zu senden. Auf diese Weise bieten sie die Abwärtskompatibilität für bestehende Kunden, bieten aber gleichzeitig den neuen Clients die Möglichkeit, HTTP 422 zu nutzen.


Das neueste Update zu RFC7321 sagt:

 The 400 (Bad Request) status code indicates that the server cannot or will not process the request due to something that is perceived to be a client error (eg, malformed request syntax, invalid request message framing, or deceptive request routing). 

Dies bestätigt, dass Server HTTP 400 für eine ungültige Anforderung senden können. 400 bezieht sich nicht mehr nur auf Syntaxerrors , 422 ist jedoch immer noch eine echte Antwort, sofern die Clients damit umgehen können.

Sie sollten tatsächlich “200 OK” zurückgeben und im Antworttext eine Nachricht darüber einfügen, was mit den geposteten 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 Bedeutung haben, nicht auf der Anwendungsschicht. Die Anwendungsschicht sollte wirklich nie wissen, dass HTTP verwendet wird. Wenn Sie Ihre Transportschicht von HTTP auf Homing Pigeons umgestellt haben, sollte dies Ihre Anwendungsschicht in keiner Weise beeinträchtigen.

Lass mich dir 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 Postadresse. Natürlich beschließen Sie, ihr einen Liebesbrief zu schicken. Also schreibst du deinen Brief, steckst ihn in einen Umschlag, schreibst ihre Adresse auf den Umschlag, schreibst ihn und schickst ihn. Betrachten wir nun diese Szenarien

  1. Du hast vergessen, einen Straßennamen zu schreiben. Sie erhalten einen ungeöffneten Brief zurück mit einer Nachricht darauf, dass die Adresse falsch formatiert ist. Sie haben die Anfrage vermasselt und das Postamt kann damit nicht umgehen. Das entspricht dem Erhalt von “400 Bad Request”.
  2. Also fixiere die Adresse und sende den Brief erneut. Aber durch etwas Pech hast du den Namen der Straße falsch geschrieben. Sie erhalten den Brief wieder mit einer Nachricht zurück, dass die Adresse nicht existiert. Das entspricht dem Erhalt von “404 Not Found”.
  3. Sie korrigieren die Adresse erneut und diesmal schaffen Sie es, die Adresse richtig zu schreiben. Dein Mädchen erhält den Brief und schreibt dich zurück. Es entspricht dem Erhalt von “200 OK”. Dies bedeutet jedoch nicht, dass Sie mögen, was sie in ihrem Brief geschrieben hat. Es bedeutet einfach, dass sie Ihre Nachricht erhalten hat und eine Antwort für Sie hat. Bis du den Umschlag öffnest und ihren Brief liest, kannst du nicht wissen, ob sie dich sehr vermisst oder mit dir Schluss machen will.

Kurz gesagt: Die Rückgabe von “200 OK” bedeutet nicht, dass die Server-App gute Nachrichten für Sie bereithält. Es bedeutet nur, dass es 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-Standard-Code = welcher ist keiner.