2010-03-04 11 views
35

Ist es gute Praxis zu Wiederverwendung RFC HTTP-Statuscodes wie dies in Betracht gezogen werden, oder sollten wir sein neue bilden, die genau auf unsere spezifische Fehlerursachen Karte ?REST: Mapping Anwendungsfehler zu HTTP-Statuscodes

Wir entwickeln eine Web-Service-API für einige ältere Anwendungen.

Zusätzlich zu den JSON/XML-Datenstrukturen in der Antwortnachricht möchten wir HTTP-Statuscodes zurückgeben, die für die Web-Caches und Entwickler geeignet sind.

Wie gehen Sie jedoch vor, um verschiedene Fehlerklassen auf entsprechende HTTP-Statuscodes zuzuordnen? Jeder im Team einigt sich auf die folgenden:

GET/Paket/1234 kehrt 404 Not Found wenn 1234 nicht

GET/Paket/1234/next_checkpoint kehrt 400 existiert Bad Request wenn "next_checkpoint" und 1234 gelten für fragen, aber next_checkpont hier nicht sinnvoll ...

und so weiter ... aber in einigen Fällen muss die Dinge als konkreter werden nur "400" - zum Beispiel:?

POST/Versand/for_package = 1234 kehrt 412 Vorbedingung nicht erfüllt Wenn/Versand und Paket 1234 beide existieren, ABER 1234 ist noch nicht versandbereit.


(Edit: Status codes in HTTP/1.1 und Status codes in WebDAV ext.)

Antwort

24

RESTful Verwendung von HTTP bedeutet, dass Sie die API einheitlich halten müssen. Das bedeutet, dass Sie keine domänenspezifischen Methoden hinzufügen können (ala GET_STOCK_QUOTE), aber es bedeutet auch, dass Sie keine domänenspezifischen Fehlercodes hinzufügen können (ala 499 Nicht mehr lieferbar).

Tatsächlich sind die HTTP-Client-Fehlercodes eine gute Entwurfsüberprüfung, denn wenn Sie Ihre Ressourcensemantik richtig entwerfen, werden die Bedeutungen des HTTP-Fehlercodes Fehler korrekt ausdrücken. Wenn Sie der Meinung sind, dass Sie zusätzliche Fehlercodes benötigen, ist Ihr Ressourcenentwurf wahrscheinlich falsch.

Jan

+0

Also, wie Dinge wie Webdav (die HTTP verwendet) kommen mit der Erweiterung davon? Ist es einfach, weil es nicht HTTP ist (obwohl es es benutzt)? –

+0

Yeah - Ich habe mir die WebDAV-Erweiterungen angeschaut, aber ich betrachte sie als sehr DAV-spezifisch und etwas, das ich lieber nicht "wiederverwenden" möchte ... – conny

+0

Frage ist: WIE kommt einer der gängigsten Webserver mit all diesen "Substatus" davon? Codes, wenn der RFC sagt "3DIGIT gefolgt von Raum (e)"? http://support.microsoft.com/kb/943891/ – conny

0

Eigentlich sollte man das überhaupt nicht. Ihre Verwendung von 404 Not Found ist korrekt, aber 400 Bad Request wird nicht ordnungsgemäß verwendet. Ein 400 Bad Request nach dem RFC wird nur verwendet, wenn das HTTP-Protokoll fehlerhaft ist. In Ihrem Fall ist die Anfrage syntaktisch korrekt, sie ist nur ein unerwartetes Argument. Sie sollten 500 Server Error zurückgeben und dann einen Fehlercode in Ihr REST-Ergebnis einfügen.

+0

Warum ein Downvote? – Gregoire

+5

Wirklich? Alles, was es sagt, ist: "Die Anfrage konnte vom Server aufgrund einer fehlerhaften Syntax nicht verstanden werden. Der Client SOLLTE die Anfrage NICHT ohne Änderungen wiederholen. "Es wird nicht angegeben, ob der Fehler in HTTP oder dem Anwendungsschicht-Bit der Anfrage liegt. Ein 500-Server-Fehler ist für Anfragen, bei denen der Client falsche Daten gesendet hat, nicht spezifisch. Ich neige dazu, 500 Fehler als Dinge zu betrachten, die niemals passieren sollten (Programmierfehler und dergleichen), während 4xx-Reihe "ungültige Eingabe" bedeutet. –

+17

400-Serie sind für, wenn der Kunde einen Fehler gemacht hat. 500-Serie sind für, wenn der Server einen Fehler gemacht hat. In diesen Szenarien hat der Server den Fehler nicht verursacht, daher ist 500 nicht gültig. –

4

Sie sollten Antworten der 4xx-Serie verwenden, die am besten zu Ihrer Anfrage passen, wenn der Client einen Fehler macht. Achten Sie jedoch darauf, keine zu verwenden, die für bestimmte Header oder Bedingungen gedacht sind. Ich neige dazu, je nach Anwendungskontext eine lesbare Statusmeldung und entweder eine Klartextversion des Fehlers als Antworttext oder eine strukturierte Fehlermeldung zurückzugeben.

Update: Bei weiterem Lesen des RFC, "Procondition fehlgeschlagen" ist für die bedingten Überschriften gemeint, wie "if-none-match". Dafür würde ich eine allgemeine 400-Nachricht geben.

+0

Ein Hinweis in Bezug darauf, ein weiterer SO-Thread, der relevant ist: http://StackOverflow.com/Questions/1959947/whats-an-appropriate-http-Status-Code-to-Return-by-A-Rest-Api- service-for-a-vali –

+0

Eine weitere Sache, die diese Perspektive unterstützt: Die XCAP-Spezifikation (RFC4825 und HTTP) verwendet 400 Antwortcodes, wenn ein XCAP-Clientfehler auftritt. –

+0

Auch Webdav (RFC2518) verwendet 400 Antwortcodes, wenn ein ungültiger Anforderungshauptteil vorhanden ist. –

5

GET/Paket/1234/next_checkpoint Erträge 400 Bad Request wenn "next_checkpoint" und 1234 gültig sind zu fragen, aber next_checkpont hier macht keinen Sinn ...

Diese ist der falsche Weg, über diese URI nachzudenken.

URIs sind undurchsichtig, also zu beobachten, dass Teile davon "gültig" sind und andere nicht, macht aus Kundensicht keinen Sinn. Daher sollten Sie nur einen 404 an den Client zurückgeben, da die Ressource "package/1234/next_checkpoint" nicht existiert.