webentwicklung-frage-antwort-db.com.de

Welcher HTTP-Statuscode ist geeignet, um von einem REST API-Service bei einem Validierungsfehler zurückgegeben zu werden?

Ich gebe derzeit 401 Unauthorized zurück, wenn ich auf einen Validierungsfehler in meiner Django / Piston based REST API-Anwendung stoße at the HTTP Status Code Registry Ich bin nicht davon überzeugt, dass dies ein geeigneter Code für einen Validierungsfehler ist. Was empfehlen Sie?

  • 400 Ungültige Anfrage
  • 401 nicht Autorisiert
  • 403 Verboten
  • 405 Methode nicht erlaubt
  • 406 Nicht akzeptabel
  • 412 Vorbedingung fehlgeschlagen
  • 417 Erwartung fehlgeschlagen
  • 422 Nicht verarbeitbare Einheit
  • 424 Abhängigkeit fehlgeschlagen

Update : "Validierungsfehler" oben bedeutet einen Fehler bei der Datenvalidierung auf Anwendungsebene, d. H. Eine falsch angegebene Datumszeit, falsche E-Mail-Adresse usw.

356
michaeljoseph

Wenn "Validierungsfehler" bedeutet, dass die Anforderung einen Clientfehler enthält, verwenden Sie HTTP 400 (Bad Request). Wenn der URI beispielsweise ein ISO-8601-Datum haben soll und Sie feststellen, dass das Format falsch ist oder sich auf den 31. Februar bezieht, geben Sie ein HTTP 400 zurück. Das Gleiche gilt, wenn Sie wohlgeformtes XML in einem Entitätskörper und erwarten es kann nicht analysiert werden.

(1/2016): In den letzten fünf Jahren ist WebDAV s spezifischeres HTTP 422 (Unprocessable Entity) eine sehr vernünftige Alternative zu HTTP 400 geworden. Siehe zum Beispiel dessen Verwendung in JSON) API . Beachten Sie jedoch, dass HTTP 422 nicht zu HTTP 1.1 gemacht hat, RFC-7231 .

Richardson und Ruby's RESTful Web Services enthält einen sehr hilfreichen Anhang zur Verwendung der verschiedenen HTTP-Antwortcodes. Sie sagen:

400 ("Bad Request")
Wichtigkeit: Hoch.
Dies ist der allgemeine clientseitige Fehlerstatus, der verwendet wird, wenn kein anderer 4xx-Fehlercode geeignet ist. Diese Option wird häufig verwendet, wenn der Client eine Darstellung zusammen mit einer PUT- oder POST) -Anforderung sendet und die Darstellung im richtigen Format vorliegt, dies jedoch keinen Sinn ergibt. (S. 381)

und:

401 ("Nicht autorisiert")
Wichtigkeit: Hoch.
Der Client hat versucht, auf einer geschützten Ressource zu arbeiten, ohne die richtigen Authentifizierungsdaten anzugeben. Möglicherweise wurden die falschen oder gar keine Anmeldeinformationen angegeben. Die Anmeldeinformationen können ein Benutzername und ein Kennwort, ein API-Schlüssel oder ein Authentifizierungstoken sein - unabhängig davon, was der betreffende Dienst erwartet. Es ist üblich, dass ein Client eine URI anfordert und eine 401 akzeptiert, nur damit er weiß, welche Anmeldeinformationen in welchem ​​Format gesendet werden müssen. [...]

274
Jim Ferrans

Aus RFC 4918 (und auch dokumentiert unter http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml ):

Der Statuscode 422 (Nicht verarbeitbare Entität) bedeutet, dass der Server den Inhaltstyp der Anforderungsentität versteht (daher ist ein Statuscode 415 (Nicht unterstützter Medientyp) ungeeignet) und die Syntax der Anforderungsentität korrekt ist (daher eine 400 (ungültige Anforderung) ) Der Statuscode ist unangemessen.) Die enthaltenen Anweisungen konnten jedoch nicht verarbeitet werden. Diese Fehlerbedingung kann beispielsweise auftreten, wenn ein XML-Anforderungstext wohlgeformte (d. H. Syntaktisch korrekte), aber semantisch fehlerhafte XML-Anweisungen enthält.

86
ReWrite

Ein Duplikat in der Datenbank sollte ein 409 CONFLICT Sein.

Ich empfehle die Verwendung von 422 UNPROCESSABLE ENTITY Für Validierungsfehler.

Ich erkläre hier 4xx-Codes ausführlicher: http://parker0phil.com/2014/10/16/REST_http_4xx_status_codes_syntax_and_sematics/

23
Phil Parker

Hier ist es:

rfc2616 # section-10.4.1 - 400 Bad Request

Die Anfrage konnte vom Server aufgrund von fehlerhafte Syntax nicht verstanden werden. Der Kunde sollte die Anfrage NICHT ohne Änderungen wiederholen.

rfc7231 # section-6.5.1 - 6.5.1. 400 Bad Request

Der Statuscode 400 (Bad Request) gibt an, dass der Server die Anforderung aufgrund eines als Clientfehler wahrgenommenen Fehlers nicht verarbeiten kann oder wird (z. B. fehlerhafte Anforderungssyntax, Ungültiges Anforderungsnachrichten-Framing oder irreführendes Anforderungs-Routing) .

Bezieht sich auf fehlerhafte (nicht gut ausgebildete) Fälle!

rfc4918 - 11.2. 422 Nicht verarbeitbare Entität

Der Statuscode 422 (Unprocessable Entity) bezeichnet den Server
versteht den Inhaltstyp der Anforderungsentität (daher ist ein 415-Statuscode (nicht unterstützter Medientyp) ungeeignet), und die Syntax der Anforderungsentität ist korrekt (also 400 (fehlerhaft) Request) status code ist unangemessen, konnte die enthaltenen Anweisungen jedoch nicht verarbeiten. Diese Fehlerbedingung kann beispielsweise auftreten, wenn ein XML-Anforderungshauptteil wohlgeformte (d. H. Syntaktisch korrekte), aber semantisch fehlerhafte XML-Anweisungen enthält.

Fazit

Faustregel: [_] 00 deckt den allgemeinsten Fall und Fälle ab, die nicht durch den festgelegten Code abgedeckt sind.

422 passt am besten zum Objektvalidierungsfehler (genau meine Empfehlung :)
Bezüglich semantisch falsch - Denken Sie an eine Validierung wie "Dieser Benutzername existiert bereits".

400 wird fälschlicherweise für die Objektvalidierung verwendet

16
honzajde

Ich würde sagen, technisch gesehen handelt es sich möglicherweise nicht um einen HTTP-Fehler, da die Ressource (vermutlich) gültig angegeben wurde, der Benutzer authentifiziert wurde und kein Betriebsfehler aufgetreten ist (jedoch enthält auch die Spezifikation einige reservierte Codes wie 402 Payment Required, die nicht angegeben wurden). t Streng genommen auch HTTP-bezogen, obwohl es ratsam sein kann, dies auf Protokollebene zu tun, damit jedes Gerät den Zustand erkennen kann.

Wenn dies tatsächlich der Fall ist, würde ich der Antwort ein Statusfeld mit Anwendungsfehlern hinzufügen, z

<status> <code> 4 </ code> <message> Datumsbereich ist ungültig </ message> </ status>

8
jspcal

Weitere Informationen zur Semantik dieser Fehler finden Sie in RFC 2616 , das HTTP 1.1 dokumentiert.

Persönlich würde ich wahrscheinlich 400 Bad Request, aber dies ist nur meine persönliche Meinung ohne sachliche Unterstützung.

1
andri

Was genau meinen Sie mit "Validierungsfehler"? Was validierst du? Beziehen Sie sich auf einen Syntaxfehler (z. B. fehlerhaftes XML)?

Wenn das der Fall ist, würde ich sagen, 400 Bad Request ist wahrscheinlich das Richtige, aber ohne zu wissen, was Sie "validieren", ist es unmöglich zu sagen.

0
Nicholas Knight