it-swarm.com.de

Restfehlermeldung im HTTP-Header oder im Antworttext?

Ich habe einen REST - Dienst, der für iPhone- und Android-Clients verfügbar ist. Derzeit folge ich den HTTP-Codes 200, 400, 401, 403, 404, 409, 500 usw.

Meine Frage ist, wo ist der empfohlene Ort, um den Grund/die Beschreibung/die Ursache des Fehlers anzugeben? Ist es für die REST - API sinnvoller, immer einen benutzerdefinierten Grund im Header zu haben?

< HTTP/1.1 400 Bad Request - Missing Required Parameters.
< Date: Thu, 20 Dec 2012 01:09:06 GMT
< Server: Apache/2.2.22 (Ubuntu)
< Connection: close
< Transfer-Encoding: chunked

Oder ist es besser, es über JSON im Response Body zu haben? 

< HTTP/1.1 400 Bad Request
< Date: Thu, 20 Dec 2012 01:09:06 GMT
< Server: Apache/2.2.22 (Ubuntu)
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: application/json
{ "error" : "Missing Required Parameters" }
62
James Cowhen

Zitieren aus der HTTP-Spezifikation für 400.x-Fehlercodes:

Der Statuscode der Klasse 4xx ist für Fälle vorgesehen, in denen der Client scheint sich geirrt zu haben. Wenn Sie nicht auf eine HEAD -Anfrage antworten, wird die Server SOLLTE eine Entität einschließen, die eine Erläuterung des Fehlers enthält und ob es sich um einen vorübergehenden oder dauerhaften Zustand handelt. Diese Statuscodes gelten für jede Anforderungsmethode. Benutzeragenten SOLLTEN Anzeige aller enthaltenen Entitäten für den Benutzer.

Es ist empfehlenswert, die Fehlernachricht als Entität in den Hauptteil der HTTP-Antwort aufzunehmen - sei es JSON, Nur-Text, formatiertes HTML oder ein anderes Format, das Sie verwenden möchten.

78
Perception

Es ist besser, Fehlerdetails im Körper zu haben. Außerdem unterstützen viele (die meisten/fast alle, z. B. WSGI) Server und Clients das Ändern des Namens des Fehlercodes nicht - behandeln sie als feste Paare (z. B. 400 ist immer "Bad Request" und nicht "Bad Request" - Sie Vergessen, die Benutzer-ID anzugeben "). Auch wenn sie nicht kaputt gehen, kümmert sie sich nicht um Ihren speziellen Namen für einen bestimmten Fehlercode.

18
Tadeck

Ich mache immer beides. Normalerweise setze ich die Statusmeldung auf etwas, das das Frontend dem Benutzer auf freundliche Weise anzeigen kann, z. B. "409 - Der neue Benutzer konnte nicht hinzugefügt werden, er existiert bereits."

Ich füge dann die Details der Fehlerbedingungen als JSON in den Körper ein, damit die UI-Entwickler versuchen können, intelligente Entscheidungen zu treffen, was zu tun ist.

{
  "status": 409,
  "message": "The user <username> was already added on <when> by <who> and given the user id 12345.",
  "errors": {
    "id": 12345
  }
}
0
Matthew Purdon

Der Fehler gehört nicht in den Körper. Es gehört in den Warning-Header.

Der allgemeine HTTP-Header für Warnungen enthält Informationen zu möglichen Probleme mit dem Status der Nachricht.

Referenz

0
B Seven