Richtiger HTTP-Statuscode für falsche Eingabe

169

Was ist der optimale HTTP-Antwortcode, wenn nicht 200 (alles in Ordnung), sondern ein Fehler bei der Eingabe gemeldet wird?

Sie senden beispielsweise einige Daten an den Server und es wird darauf reagiert, dass Ihre Daten falsch sind

Verwendung 500sieht mehr wie Server Problem
mit 200mit Warnung / Fehlerantworttext schlecht ist (so dass das Caching und alles ist nicht OK)
mit 204und Rückkehr nichts, ist vielleicht gut (aber gut unterstützt?)
mit 404falsch ist , wenn die angeforderte Pfad (Skript) zur Verfügung und am richtigen Ort

Marek Sebera
quelle
Siehe meine Antwort für Details stackoverflow.com/a/59527615/4127230
shiva2492

Antworten:

210

Wir hatten das gleiche Problem auch bei der Erstellung unserer API. Wir suchten nach einem HTTP-Statuscode, der einem entspricht InvalidArgumentException. Nachdem wir den folgenden Quellartikel gelesen hatten, verwendeten wir 422 Unprocessable Entitydie folgenden Zustände:

Der Statuscode 422 (nicht verarbeitbare Entität) bedeutet, dass der Server den Inhaltstyp der Anforderungsentität versteht (daher ist ein 415-Statuscode (nicht unterstützter Medientyp) unangemessen) und die Syntax der Anforderungsentität korrekt ist (daher eine 400 (fehlerhafte Anforderung) ) Statuscode ist unangemessen) konnte die enthaltenen Anweisungen jedoch nicht verarbeiten. Diese Fehlerbedingung kann beispielsweise auftreten, wenn ein XML-Anforderungshauptteil wohlgeformte (dh syntaktisch korrekte), aber semantisch fehlerhafte XML-Anweisungen enthält.

Quelle: https://www.bennadel.com/blog/2434-http-status-codes-for-invalid-data-400-vs-422.htm

Keego
quelle
138

Codes, die mit 4 (4xx) beginnen, sind für Clientfehler gedacht. Vielleicht könnten 400 (Bad Request) für diesen Fall geeignet sein? Die Definition in http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html lautet:

"Die Anfrage konnte vom Server aufgrund einer fehlerhaften Syntax nicht verstanden werden. Der Client sollte die Anfrage NICHT ohne Änderungen wiederholen."

esaj
quelle
13
400 Bad Requestist nicht schlecht, sollte aber generell für fehlerhafte Syntax reserviert werden. OP scheint mehr über einen Fall mit wohlgeformter Syntax, aber ungültigen Werten besorgt zu sein. Plus 400 ist ein ziemlich häufiger Antwortcode "Oh Scheiße, etwas stimmte nicht", den Sie möglicherweise von einem bestimmten Fall fehlerhafter Eingabe unterscheiden möchten.
Keego
4
Beachten Sie, dass der Wortlaut in RFC 7231 aktualisiert wurde und die Meldung "Die Anforderung konnte vom Server aufgrund einer fehlerhaften Syntax nicht verstanden werden" auf "Der Server kann oder wird die Anforderung aufgrund von Informationen, die als Client wahrgenommen werden, nicht verarbeiten kann" aktualisiert wurde Fehler (z. B. fehlerhafte Anforderungssyntax, ungültiger Anforderungsnachrichtenrahmen oder irreführendes Anforderungsrouting) ".
Calimo
14

Neben der RFC-Spezifikation können Sie dies auch in Aktion sehen. Schauen Sie sich die Twitter-Antworten an.

https://developer.twitter.com/de/docs/ads/general/guides/response-codes

Mob
quelle
19
Sie erhalten möglicherweise mehr positive Stimmen, wenn Sie Beispiele aus Ihren Links herausziehen.
Jared Thirsk
Ich habe in meinem Beitrag stackoverflow.com/a/59527615/4127230
shiva2492
1
Für mich führt der Link ( fb-developers.info/tech/fb_dev/faq/general/gen_10.html ) zu einer zufälligen Anzeige. Ich denke, die Domain wurde gefälscht
dmitry502
@ dmitry502 Beantwortet bearbeitet bearbeitet, um den gefälschten Link zu entfernen. Vielen Dank für Ihren Kommentar
Francis
9

409 Conflict könnte eine akzeptable Lösung sein.

Laut: https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Die Anforderung konnte aufgrund eines Konflikts mit dem aktuellen Status der Ressource nicht abgeschlossen werden. Dieser Code ist nur in Situationen zulässig, in denen erwartet wird, dass der Benutzer den Konflikt möglicherweise lösen und die Anforderung erneut senden kann. Der Antworttext sollte genügend Informationen enthalten, damit der Benutzer die Ursache des Konflikts erkennen kann. Im Idealfall würde die Antwortentität genügend Informationen enthalten, damit der Benutzer oder Benutzeragent das Problem beheben kann. Dies ist jedoch möglicherweise nicht möglich und nicht erforderlich.

Das Dokument fährt mit einem Beispiel fort:

Konflikte treten am wahrscheinlichsten als Antwort auf eine PUT-Anforderung auf. Wenn beispielsweise die Versionierung verwendet wird und die Entität, die PUT ist, Änderungen an einer Ressource enthält, die mit denen einer früheren Anforderung (von Drittanbietern) in Konflikt stehen, verwendet der Server möglicherweise die Antwort 409, um anzuzeigen, dass die Anforderung nicht abgeschlossen werden kann . In diesem Fall würde die Antwortentität wahrscheinlich eine Liste der Unterschiede zwischen den beiden Versionen in einem Format enthalten, das durch den Antwortinhaltstyp definiert wird.


In meinem Fall möchte ich eine Zeichenfolge, die eindeutig sein muss, über eine API in eine Datenbank einfügen. Bevor ich es zur Datenbank hinzufüge, überprüfe ich, ob es noch nicht in der Datenbank vorhanden ist.

Wenn ja, werde ich zurückkehren "Error: The string is already in the database", 409.

Ich glaube, das wollte das OP: Ein Fehlercode, der geeignet ist, wenn die Daten die Kriterien des Servers nicht erfüllen.

Alex Fortin
quelle
2

Nach dem folgenden Szenario

Angenommen, jemand sendet eine Anfrage an Ihren Server mit Daten, die im richtigen Format vorliegen, aber einfach keine "guten" Daten sind. Stellen Sie sich zum Beispiel vor, jemand hat einen String-Wert an einen API-Endpunkt gesendet, der einen String-Wert erwartet hat. Der Wert der Zeichenfolge enthielt jedoch Daten, die auf die schwarze Liste gesetzt wurden (z. B. um zu verhindern, dass Personen "Kennwort" als Kennwort verwenden). dann könnte der Statuscode entweder 400 oder 422 sein?

Bis jetzt hätte ich eine "400 Bad Request" zurückgegeben, was laut w3.org bedeutet:

Die Anforderung konnte vom Server aufgrund einer fehlerhaften Syntax nicht verstanden werden. Der Client sollte die Anfrage NICHT ohne Änderungen wiederholen.

Diese Beschreibung passt nicht ganz zum Umstand; Wenn Sie sich jedoch die Liste der im HTTP / 1.1-Protokoll definierten zentralen HTTP-Statuscodes ansehen, ist dies wahrscheinlich die beste Wahl.

Kürzlich hat mich jedoch jemand aus meinem Entwicklerteam darauf hingewiesen, dass beliebte APIs zunehmend HTTP-Erweiterungen verwenden, um ihre Fehlerberichte genauer zu gestalten. Insbesondere verwenden viele APIs wie Twitter und Recurly den Statuscode "422 Unprocessable Entity", wie in der HTTP-Erweiterung für WebDAV definiert. Der HTTP-Statuscode 422 lautet:

Der Statuscode 422 (nicht verarbeitbare Entität) bedeutet, dass der Server den Inhaltstyp der Anforderungsentität versteht (daher ist ein 415-Statuscode (nicht unterstützter Medientyp) unangemessen) und die Syntax der Anforderungsentität korrekt ist (daher eine 400 (fehlerhafte Anforderung) ) Statuscode ist unangemessen) konnte die enthaltenen Anweisungen jedoch nicht verarbeiten. Diese Fehlerbedingung kann beispielsweise auftreten, wenn ein XML-Anforderungshauptteil wohlgeformte (dh syntaktisch korrekte), aber semantisch fehlerhafte XML-Anweisungen enthält.

Zurück zu unserem Passwortbeispiel von oben: Dieser 422-Statuscode ist viel angemessener. Der Server versteht, was Sie versuchen. und es versteht die Daten, die Sie übermitteln; Diese Daten werden einfach nicht verarbeitet.

shiva2492
quelle
-7

404 - Nicht gefunden - kann verwendet werden für Der angeforderte URI ist ungültig oder die angeforderte Ressource, z. B. ein Benutzer, ist nicht vorhanden.

Benutzer
quelle
2
Das OP schloss dies bereits aus: "Die Verwendung von 404 ist falsch, wenn der angeforderte Pfad (Skript) verfügbar und an der richtigen Stelle ist "
Remy Lebeau