521 Stimmen

400 vs 422 Antwort auf POST von Daten

Ich versuche herauszufinden, welcher Statuscode in verschiedenen Szenarien mit einer "REST-ähnlichen" API, an der ich arbeite, zurückgegeben werden soll. Angenommen, ich habe einen Endpunkt, der das POSTen von Käufen im JSON-Format ermöglicht. Es sieht so aus:

{
    "account_number": 45645511,
    "upc": "00490000486",
    "price": 1.00,
    "tax": 0.08
}

Was sollte ich zurückgeben, wenn der Client mir "sales_tax" sendet (anstelle von "tax"). Derzeit gebe ich eine 400 zurück. Aber ich habe angefangen, an mir selbst zu zweifeln. Sollte ich wirklich eine 422 zurückgeben? Ich meine, es handelt sich um JSON (was unterstützt wird) und es ist gültiges JSON, es enthält einfach nicht alle erforderlichen Felder.

4voto

Clojurevangelist Punkte 554

422 Unprocessable Entity Erklärt Aktualisiert: 6. März 2017

Was ist 422 Unprocessable Entity?

Ein 422-Statuscode tritt auf, wenn eine Anfrage wohlgeformt ist, jedoch aufgrund semantischer Fehler nicht verarbeitet werden kann. Dieser HTTP-Status wurde in RFC 4918 eingeführt und ist speziell auf HTTP-Erweiterungen für die webbasierte verteilte Autoren- und Versionsverwaltung (WebDAV) ausgerichtet.

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

Eine wortwörtliche Definition des Statuscodes 422 aus Abschnitt 11.2 in RFC 4918 kann unten gelesen werden.

Der Statuscode 422 (Unprocessable Entity) bedeutet, dass der Server den Inhaltstyp der Anfrage-Entität versteht (daher ist ein Statuscode 415 (Unsupported Media Type) unangemessen) und die Syntax der Anfrage-Entität korrekt ist (daher ist ein Statuscode 400 (Bad Request) unangemessen), aber nicht in der Lage war, die enthaltenen Anweisungen zu verarbeiten.

Die Definition fährt fort zu sagen:

Zum Beispiel kann dieser Fehlerfall auftreten, wenn der XML-Anforderungskörper syntaktisch korrekte, aber semantisch fehlerhafte XML-Anweisungen enthält.

400 vs 422 Statuscodes

Fehlerhafte Anfragen verwenden den Statuscode 400 und sollten an den Client zurückgegeben werden, wenn die Anforderungssyntax fehlerhaft ist, ungültige Anfrage-Nachrichtenrahmen enthält oder irreführende Anforderungswege aufweist. Dieser Statuscode mag dem Statuscode 422 Unprocessable Entity sehr ähnlich erscheinen, jedoch unterscheidet sie ein kleines Detail: Die Syntax einer Anfrage-Entität für einen 422-Fehler ist korrekt, während die Syntax einer Anfrage, die einen 400-Fehler erzeugt, inkorrekt ist.

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

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

3voto

Yuvi Punkte 1085

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

Idealszenario für 422:

In einer idealen Welt ist 422 bevorzugt und im Allgemeinen akzeptabel als Antwort, wenn der Server den Inhaltstyp der Anforderungseinheit versteht und die Syntax der Anforderungseinheit korrekt ist, aber nicht in der Lage war, die Daten zu verarbeiten, weil sie semantisch fehlerhaft sind.

Situationen von 400 über 422:

Denken Sie daran, der Antwortcode 422 ist ein erweiterter HTTP (WebDAV) Statuscode. Es gibt immer noch einige HTTP-Clients / Front-End-Bibliotheken, die nicht darauf vorbereitet sind, 422 zu verarbeiten. Für sie ist es so einfach wie "HTTP 422 ist falsch, weil es nicht HTTP ist". Aus Sicht des Dienstes ist 400 nicht ganz spezifisch.

In der Enterprise-Architektur werden die Dienste hauptsächlich auf Dienstschichten wie SOA, IDM usw. bereitgestellt. Sie bedienen typischerweise mehrere Clients, die von sehr alten nativen Clients bis zu den neuesten HTTP-Clients reichen. Wenn einer der Clients kein HTTP 422 behandelt, besteht die Möglichkeit, den Client aufzufordern, ein Upgrade durchzuführen oder Ihren Antwortcode für alle auf HTTP 400 zu ändern. Meiner Erfahrung nach ist dies heutzutage sehr selten, aber immer noch möglich. Daher ist eine sorgfältige Untersuchung Ihrer Architektur immer erforderlich, bevor Sie sich für die HTTP-Antwortcodes entscheiden.

Um Situationen wie diese zu behandeln, verwenden die Dienstschichten normalerweise Versionierung oder richten Konfigurations-Flags ein, um strikte HTTP-Konformitätsclients zu senden 400 und senden 422 für den Rest von ihnen. Auf diese Weise bieten sie rückwärtskompatible Unterstützung für bestehende Verbraucher, ermöglichen aber gleichzeitig den neuen Clients, HTTP 422 zu konsumieren.


Das neueste Update zu RFC7321 besagt:

Der 400 (Bad Request) Statuscode zeigt an, dass der Server die Anforderung nicht verarbeiten kann oder
   wird aufgrund eines als Clientfehler wahrgenommenen Problems nicht verarbeiten (z. B. fehlerhafte Anforderungssyntax, ungültiges Anforderungsmeldungs-Framing oder irreführende Anforderungsroute).

Dies bestätigt, dass Server HTTP 400 für ungültige Anfragen senden können. 400 bezieht sich nicht mehr nur auf einen Syntaxfehler, jedoch ist 422 immer noch eine legitime Antwort, sofern die Clients sie verarbeiten können.

2voto

LEMUEL ADANE Punkte 7356

400 - Die Validierung der Anforderung ist fehlgeschlagen, z. B. wenn die Daten fehlen oder einen falschen Typ haben usw., sodass ihr ein Status von 400 zugewiesen wird.

422 - Bestanden die Validierung der Anforderung, aber die Durchführung des Vorgangs ist fehlgeschlagen, da entweder die Anforderungsdaten oder Teile davon einen Fehler liefern, aber es wird behandelt und ein Status von 422 zugewiesen.

-3voto

Zunächst einmal handelt es sich um eine sehr gute Frage.

400 Bad Request - Wenn ein entscheidendes Informationsstück aus der Anfrage fehlt

z.B. Der Autorisierungsheader oder der Inhalts-Typ-Header. Die vom Server unbedingt erforderlich sind, um die Anfrage zu verstehen. Dies kann von Server zu Server unterschiedlich sein.

422 Unprocessable Entity - Wenn der Anfragekörper nicht geparst werden kann.

Dies ist weniger schwerwiegend als 400. Die Anfrage hat den Server erreicht. Der Server hat die Anfrage bestätigt und die grundlegende Struktur korrekt erhalten. Aber die Informationen im Anfragekörper können nicht geparst oder verstanden werden.

z.B. Inhaltstyp: Anwendung/xml wenn der Anfragekörper JSON ist.

Hier ist ein Artikel, der Statuscodes und deren Verwendung in REST-APIs auflistet. https://metamug.com/article/status-codes-for-rest-api.php

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X