REST-Antwortcode für ungültige Daten

272

Welcher Antwortcode sollte in folgenden Szenarien an den Client übergeben werden?

  1. Bei der Benutzerregistrierung wurden ungültige Daten wie falsches E-Mail-Format übergeben
  2. Benutzername / E-Mail ist bereits vorhanden

Ich habe 403 gewählt. Ich habe auch festgestellt, dass ich das Gefühl habe, verwendet werden zu können.

Wikipedia:

412 Voraussetzung fehlgeschlagen: Der Server erfüllt nicht eine der Voraussetzungen, die der Anforderer für die Anforderung gestellt hat

Schlagen Sie Code vor, wenn ich einen anderen als 403 verwenden soll.

Amit Patel
quelle
Mögliches Duplikat: stackoverflow.com/questions/3050518/…
Genjo
Ich löse auch dieses Problem. Kapitel 7.Validierung der JAX-RS-Spezifikation (2017) enthält Hinweise zum Statuscode speziell für Verstöße gegen Einschränkungen. download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/…
Burntsugar

Antworten:

298

400 ist in beiden Fällen die beste Wahl. Wenn Sie den Fehler weiter klären möchten, können Sie entweder die Begründungsphrase ändern oder einen Text einfügen, um den Fehler zu erklären.

412 - Die Bedingung "Fehlgeschlagen" wird für bedingte Anforderungen verwendet, wenn das Datum der letzten Änderung und ETags verwendet werden.

403 - Verboten wird verwendet, wenn der Server den Zugriff auf eine Ressource verhindern möchte.

Die einzige andere Möglichkeit, die möglich ist, ist 422 - Nicht verarbeitbare Entität.

Darrel Miller
quelle
10
Während es in diesem Zusammenhang häufig verwendet wird, ist 403 nicht auf die Zugriffskontrolle beschränkt, da rfc2616-10.4.4 sagt: "Der Server hat die Anforderung verstanden, weigert sich jedoch, sie zu erfüllen. [...] wenn der Server dies wünscht öffentlich, warum der Antrag nicht erfüllt wurde, sollte es den Grund für die Ablehnung in der Einheit beschreiben. " Der Grund können ungültige Daten sein. 422 ist hier jedoch zutreffender.
Yannick Loiseau
7
Lassen Sie uns nicht in Textkritik verwickelt werden. Siehe zum Beispiel trac.tools.ietf.org/wg/httpbis/trac/ticket/294, in dem versucht wird zu verdeutlichen, dass es bei 403 immer um Autorisierung geht und ging.
Fumanchu
2
@ Fumanchu Schöner Fang. Ein Link zu einer Änderungsanfrage, die erst 7 Stunden alt ist :-)
Darrel Miller
1
@fumanchu Dies bedeutet, dass 403 zurückgegeben werden sollte, wenn der Benutzer keine Berechtigung zum Zugriff auf die angeforderte Ressource hat. Ich denke jedoch, dass 401 Unauthorized besser für den Zugriff auf Ressourcen geeignet ist, für die der Benutzer keine Berechtigung hat.
Amit Patel
1
401 Unauthorized fordert einen Webbrowser auf, dem Benutzer die Standardaufforderung für den HTTP-Benutzernamen / das Standardkennwort anzuzeigen. Wenn Sie diese Art der Authentifizierung nicht für Ihren Dienst verwenden oder wenn der Benutzer bereits über eine HTTP-Authentifizierung verfügt, ist 401 nicht geeignet.
Greg Ball
92

Ich würde 422 empfehlen. Es ist nicht Teil der HTTP-Hauptspezifikation, aber es wird durch einen öffentlichen Standard (WebDAV) definiert und sollte von Browsern genauso behandelt werden wie jeder andere 4xx-Statuscode.

Aus RFC 4918 :

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.

Mike Deck
quelle
20
Beachten Sie, dass der zitierte Text besagt, dass 422 anwendbar ist, wenn die Anforderungsentität syntaktisch wohlgeformt, aber semantisch fehlerhaft ist. Wenn die Anforderungsentität verstümmelt ist, ist 400 die geeignete Antwort.
Matty K
87

Wenn die Anforderung nicht korrekt analysiert werden konnte (einschließlich der Anforderungsentität / des Hauptteils), lautet die entsprechende Antwort 400 Bad Request [ 1 ].

RFC 4918 besagt, dass 422 Unprocessable Entity anwendbar ist, wenn die Anforderungsentität syntaktisch wohlgeformt, aber semantisch fehlerhaft ist. Wenn die Anforderungsentität verstümmelt ist (wie ein schlechtes E-Mail-Format), verwenden Sie 400; aber wenn es einfach keinen Sinn macht (wie @example.com), benutze 422.

Wenn das Problem darin besteht, dass, wie in der Frage angegeben, Benutzername / E-Mail bereits vorhanden ist, können Sie 409 Conflict [ 2 ] mit einer Beschreibung des Konflikts und einem Hinweis zur Behebung des Konflikts verwenden (in diesem Fall "Wählen Sie eine aus" anderer Benutzername / E-Mail "). In der angegebenen Spezifikation kann jedoch auch in diesem Fall 403 Forbidden [ 3 ] verwendet werden, ungeachtet der Argumente zur HTTP-Autorisierung.

412 Vorbedingung fehlgeschlagen [ 4 ] wird verwendet, wenn ein vom Client bereitgestellter Vorbedingungsanforderungsheader (z. B. If-Match) als falsch ausgewertet wird. Das heißt, der Kunde forderte etwas an und lieferte die Voraussetzungen, wobei er genau wusste, dass diese Voraussetzungen möglicherweise fehlschlagen. 412 sollte nie auf dem Client aus heiterem Himmel entstanden sein und nicht auf die Anfrage Einheit in Beziehung gesetzt werden sollte per se .

Matty K.
quelle
1
Ich sollte die aktualisierten HTTP / 1.1-RFCs beachten: 400 Bad Request, 409 Conflict, 403 Forbidden usw. live in tools.ietf.org/html/rfc7231 ; 412 Voraussetzung fehlgeschlagen ist in tools.ietf.org/html/rfc7232#section-4.2
Matty K
41

Es ist amüsant, 418 I'm a teapotzu Anforderungen zurückzukehren, die offensichtlich manipuliert oder böswillig sind und "nicht passieren" können, z. B. fehlgeschlagene CSRF-Prüfung oder fehlende Anforderungseigenschaften.

2.3.2 418 Ich bin eine Teekanne

Jeder Versuch, Kaffee mit einer Teekanne zuzubereiten, sollte den Fehlercode "418 Ich bin eine Teekanne" ergeben. Der resultierende Entitätskörper kann kurz und kräftig sein.

Um es einigermaßen ernst zu halten, beschränke ich die Verwendung lustiger Fehlercodes auf RESTful-Endpunkte, die dem Benutzer nicht direkt zugänglich sind.

doug65536
quelle
11
Implementieren Sie es so, dass Ihre API 418 I'm a teapotfür alle Anfragen von Ihrem Chef
zurückgibt
2
@vikarjramun Ich habe einen Dummy-REST erstellt und einen pruduktiven offline gemacht. (Vorabversion) Jetzt suchen unsere Schüler nach gültigen Datenanforderungen, aber es ist alles Teekanne. Ich bin der "Chef" - aber es funktioniert auch.
LenglBoy
2
Dieser RFC ist dumm. Sie können Kaffee in einer Teekanne zubereiten, solange Sie ihn durch ein Teesieb in Ihre Tasse gießen. Genau wie bei der Verwendung von Loseblatt-Tee. Sie können auch ohne Probleme Tee in einer Cafetiere zubereiten.
Gburton
2
@gburton Das erfordert allerdings ein Eingreifen eines Menschen. Über das Netzwerk benötigen Sie auf jeden Fall ein kaffeefähiges Gerät, um Kaffee zuzubereiten. Natürlich sollte eine Kaffee- und Teekanne nicht mit einem 418 antworten.
Jasper