Restfehlermeldung im HTTP-Header oder Antworttext?

82

Ich habe einen REST-Service, 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 sinnvoller, wenn die REST-API immer einen benutzerdefinierten Grund im Header hat?

< 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" }
James Cowhen
quelle
6
Heutzutage ist es üblich, benutzerdefinierte Header hinzuzufügen, z. B. "X-HTTP-Fehlerbeschreibung: Fehlende erforderliche Parameter".
andreszs

Antworten:

94

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

Die Statuscodeklasse 4xx ist für Fälle vorgesehen, in denen der Client einen Fehler begangen zu haben scheint. Außer bei der Beantwortung einer HEAD-Anfrage sollte der Server eine Entität enthalten, die eine Erläuterung der Fehlersituation enthält und angibt, ob es sich um eine vorübergehende oder eine dauerhafte Bedingung handelt. Diese Statuscodes gelten für jede Anforderungsmethode. Benutzeragenten sollten dem Benutzer alle enthaltenen Entitäten anzeigen.

Es wird empfohlen, die Fehlermeldung als Entität in den Text der HTTP-Antwort aufzunehmen - sei es JSON, einfacher Text, formatiertes HTML oder ein anderes Format, das Sie möglicherweise verwenden möchten.

Wahrnehmung
quelle
24

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

Tadeck
quelle
3

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

Der allgemeine HTTP-Header "Warnung" enthält Informationen zu möglichen Problemen mit dem Status der Nachricht.

Referenz

B Sieben
quelle
3
Wäre schön, dafür einen "offiziellen" Header zu verwenden. Wie Warningder Name schon sagt, handelt es sich jedoch nicht um Fehler. Der RFC (7234) sagt:> Die Verwendung einer Warnung anstelle eines Fehlerstatuscodes unterscheidet diese Antworten von echten Fehlern.
Frans
1
Hinweis: Der Warnheader wird bald veraltet sein. Weitere Informationen finden Sie unter Warnung ( github.com/httpwg/http-core/issues/139 ) und Warnung: Header & Stale-While-Revalidate ( github.com/whatwg/fetch/issues/913 ).
Bizmarck
-5

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

Ich füge dann die Details der Fehlerbedingungen als JSON in den Text ein, damit die Benutzeroberflächenentwickler versuchen können, intelligente Entscheidungen darüber 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
  }
}
Matthew Purdon
quelle
10
Ich habe das schon einmal gesehen, als ich den HTTP-Statuscode in den Antworttext eingefügt habe, aber ich kann nicht verstehen, warum irgendjemand denken würde, dass dies überhaupt in Ordnung ist, geschweige denn gut. Jeder Client, der diesen Fehler erhält, sollte in der Lage sein, die Antwortheader zu verwenden, die diesen Code bereits enthalten. Daher ist das Hinzufügen zum Text überflüssig und führt zu inkonsistenten Informationen. Warum?
TheHerk
Viele Anwendungsfälle, aber denken Sie im Grunde an die beiden Codes, die in verschiedenen Teilen der Anwendung behandelt werden. Der http-Statuscode im Header wird von der Kommunikationsschicht abgefangen und möglicherweise verarbeitet. Auf Anwendungsebene kann der 409 oder ein 422 unterschiedlich behandelt werden, um den Benutzer zur richtigen Vorgehensweise zu leiten. (Ebenen werden hier grob verwendet, um beispielsweise die Ebenen in einem SPA zu erklären)
Matthew Purdon