Ich erstelle eine Anwendung mit einer REST-basierten API und bin an einem Punkt angelangt, an dem ich Statuscodes für jede Anforderung spezifiziere.
Welchen Statuscode sollte ich für Anfragen senden, bei denen die Validierung fehlschlägt oder bei denen eine Anfrage versucht, ein Duplikat in meine Datenbank aufzunehmen?
Ich habe http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html durchgesehen, aber keiner von ihnen scheint richtig zu sein.
Gibt es eine gängige Praxis beim Senden von Statuscodes?
http
rest
http-status-codes
alexn
quelle
quelle
Antworten:
Bei Fehler bei der Eingabevalidierung: 400 Bad Request + Ihre optionale Beschreibung. Dies wird im Buch " RESTful Web Services " vorgeschlagen. Für doppelte Einreichung: 409 Konflikt
Update Juni 2014
Die relevante Spezifikation war früher RFC2616 , was die Verwendung von 400 (Bad Request) eher eng als
Es könnte also argumentiert worden sein, dass es für semantische Fehler ungeeignet war. Aber nicht mehr; Seit Juni 2014 sieht der relevante Standard RFC 7231 , der den vorherigen RFC2616 ersetzt, die Verwendung von 400 (Bad Request) im weiteren Sinne vor
quelle
something perceived to be a client error
, dass alle in diesem Absatz aufgeführten Beispiele Verstöße gegen das HTTP-Protokoll und keine logischen Fehler sind: Syntax, Framing, Routing. Daher bin ich der Meinung, dass die HTTP-Spezifikation 400 für eine fehlgeschlagene Validierung auf Anwendungsebene nicht zulässt.Sie sollten auf jeden Fall eine detailliertere Erklärung in den Antwortheadern und / oder im Text geben (z. B. mit einem benutzerdefinierten Header -
X-Status-Reason: Validation failed
).quelle
HTTP/1.0 403 Form validation errors
der sauberste Weg ist.Ich empfehle den Statuscode 422 "Nicht verarbeitbare Entität" .
quelle
200.300, 400, 500 sind alle sehr allgemein. Wenn Sie generisch möchten, ist 400 in Ordnung.
422 wird von einer zunehmenden Anzahl von APIs verwendet und wird sogar von Rails sofort verwendet.
Unabhängig davon, welchen Statuscode Sie für Ihre API auswählen, wird jemand anderer Meinung sein. Aber ich bevorzuge 422, weil ich den '400 + Textstatus' für zu allgemein halte. Außerdem nutzen Sie keinen JSON-fähigen Parser. Im Gegensatz dazu ist ein 422 mit einer JSON-Antwort sehr explizit und es können viele Fehlerinformationen übermittelt werden.
Apropos JSON-Antwort: Ich tendiere dazu, die Rails-Fehlerantwort für diesen Fall zu standardisieren:
Dieses Format eignet sich perfekt für die Formularvalidierung, die meiner Meinung nach der komplexeste Fall ist, der im Hinblick auf die Fülle von Fehlerberichten unterstützt wird. Wenn Ihre Fehlerstruktur so ist, werden wahrscheinlich alle Ihre Fehlerberichterstattungsanforderungen erfüllt.
quelle
arg1
ist gültig undarg2
gültig, aber die Kombination der beiden mit den spezifischen gesendeten Werten ist nicht gültig.200
Ugh ... (309, 400, 403, 409, 415, 422) ... viele Antworten, die versuchen, den besten Rückkehrcode für eine erfolgreiche HTTP-Anforderung, aber einen fehlgeschlagenen REST-Aufruf zu erraten, zu argumentieren und zu standardisieren .
Es ist falsch , HTTP-Statuscodes und REST-Statuscodes zu mischen.
Ich habe jedoch viele Implementierungen gesehen, die sie gemischt haben, und viele Entwickler stimmen mir möglicherweise nicht zu.
HTTP-Rückkehrcodes beziehen sich auf sich
HTTP Request
selbst. Ein REST-Aufruf wird mithilfe einer Hypertext Transfer Protocol-Anforderung ausgeführt und arbeitet auf einer niedrigeren Ebene als die aufgerufene REST-Methode selbst. REST ist ein Konzept / Ansatz, und seine Ausgabe ist ein geschäftliches / logisches Ergebnis, während der HTTP-Ergebniscode ein Transportergebnis ist .Die Rückgabe von "404 nicht gefunden" beim Aufrufen von / users / ist beispielsweise verwirrend, da dies Folgendes bedeuten kann:
"403 Verboten / Zugriff verweigert" kann bedeuten:
Und die Liste kann mit '500 Server error' (ein Apache / Nginx HTTP-Fehler oder ein Business Constraint-Fehler in REST) oder anderen HTTP-Fehlern usw. fortgesetzt werden.
Aus dem Code ist schwer zu verstehen, was der Fehlergrund, ein HTTP-Fehler (Transportfehler) oder ein REST-Fehler (logisch) war.
Wenn die HTTP-Anforderung physisch erfolgreich ausgeführt wurde, sollte immer 200 Code zurückgegeben werden, unabhängig davon, ob die Datensätze gefunden wurden oder nicht. Weil die URI-Ressource gefunden wurde und vom HTTP-Server verarbeitet wurde. Ja, möglicherweise wird ein leerer Satz zurückgegeben. Ist es möglich, eine leere Webseite mit 200 als HTTP-Ergebnis zu erhalten?
Stattdessen können Sie 200 HTTP-Code mit einigen Optionen zurückgeben:
Einige Internetanbieter können Ihre Anfragen abfangen und Ihnen einen 404-HTTP-Code zurückgeben. Dies bedeutet nicht, dass Ihre Daten nicht gefunden werden, aber auf Transportebene stimmt etwas nicht.
Aus dem Wiki :
Warum nicht einfach mit so etwas antworten?
Google gibt in seiner Geokodierungs-API immer 200 als Statuscode zurück, auch wenn die Anforderung logisch fehlschlägt: https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes
Facebook gibt für erfolgreiche HTTP-Anforderungen immer 200 zurück, auch wenn die REST-Anforderung fehlschlägt: https://developers.facebook.com/docs/graph-api/using-graph-api/error-handling
Es ist ganz einfach, HTTP-Statuscodes gelten für HTTP-Anforderungen. Die REST-API ist Ihre, definieren Sie Ihre Statuscodes.
quelle
BadRequest()
Methode verfügt über ein eigenes Rückgabemodell, das sich von Ihrem regulären Rückgabemodell unterscheidet. Das ist ein Albtraum zu analysieren. @ KevinHooke: Wenn Sie HTTP 200 für einen REST-Validierungsfehler zurückgeben, sagen Sie: "Ich habe Ihre Nachricht erhalten, die Antwort lautet" Nein ", und hier ist der Grund dafür." Bei der Rückgabe von HTTP 400 heißt es: "Ich weiß nicht, wovon Sie sprechen."Ein Duplikat in der Datenbank sollte a sein
409 CONFLICT
.Ich empfehle die Verwendung
422 UNPROCESSABLE ENTITY
für Validierungsfehler.Ich gebe eine längere Erklärung von 4xx - Codes hier .
quelle
Der Statuscode 304 Nicht geändert würde auch eine akzeptable Antwort auf eine doppelte Anfrage geben. Dies ähnelt der Verarbeitung eines Headers zur
If-None-Match
Verwendung eines Entity-Tags.Meiner Meinung nach ist die Antwort von @ Piskvor die offensichtlichere Wahl für das, was ich als Absicht der ursprünglichen Frage empfinde, aber ich habe eine Alternative, die ebenfalls relevant ist.
Wenn Sie eine doppelte Anforderung als Warnung oder Benachrichtigung und nicht als Fehler behandeln möchten, ist der Antwortstatuscode
304
Nicht geändert und derContent-Location
Header, der die vorhandene Ressource identifiziert, genauso gültig. Wenn lediglich sichergestellt werden soll, dass eine Ressource vorhanden ist, ist eine doppelte Anforderung kein Fehler, sondern eine Bestätigung. Die Anforderung ist nicht falsch, sondern einfach redundant, und der Client kann auf die vorhandene Ressource verweisen.Mit anderen Worten, die Anforderung ist gut, aber da die Ressource bereits vorhanden ist, muss der Server keine weitere Verarbeitung durchführen.
quelle
Der ActiveRecord-Adapter von Ember-Data wird voraussichtlich
422 UNPROCESSABLE ENTITY
vom Server zurückgegeben. Wenn Ihr Client in Ember.js geschrieben ist, sollten Sie 422 verwenden. Nur dann werden DS.Errors mit zurückgegebenen Fehlern gefüllt. Sie können 422 natürlich in einen anderen Code in Ihrem Adapter ändern .quelle