web-dev-qa-db-fra.com

Message d'erreur de repos dans l'en-tête HTTP ou le corps de réponse?

J'ai un service REST exposé aux clients iPhone et Android. Actuellement, je suis les codes HTTP 200, 400, 401, 403, 404, 409, 500, etc.

Ma question est où est l'endroit recommandé pour mettre la raison/description/cause de l'erreur? Est-il plus logique que l'API REST ait toujours un motif personnalisé dans l'en-tête, comme ceci?

< 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

Ou est-il préférable de l'avoir dans le corps de réponse via JSON? 

< 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

Citant la spécification HTTP pour les codes d'erreur 400.x:

La classe de code de statut 4xx est destinée aux cas dans lesquels le client semble avoir commis une erreur. Sauf lorsque vous répondez à une demande HEAD, le fichier le serveur DEVRAIT inclure une entité contenant une explication de l'erreur situation, et s’il s’agit d’une condition temporaire ou permanente. Celles-ci les codes d'état sont applicables à toute méthode de demande. Les agents d'utilisateur DEVRAIENT afficher toute entité incluse à l'utilisateur.

Il est recommandé d'inclure le message d'erreur en tant qu'entité dans le corps de la réponse HTTP - qu'il s'agisse de JSON, de texte brut, de HTML formaté ou de tout autre format que vous souhaitez utiliser.

78
Perception

Il est préférable d'avoir des détails d'erreur dans le corps. En outre, de nombreux serveurs et clients (la plupart/presque tous, par exemple WSGI) ne prennent pas en charge la modification du nom du code d'erreur; traitez-les en paires fixes J'ai oublié de spécifier l'ID utilisateur "). Même s'ils ne se cassent pas, ils ne se soucient pas de votre nom spécial pour un code d'erreur spécifique.

18
Tadeck

Je fais toujours les deux. Je règle généralement le message d'état sur quelque chose que l'utilisateur frontal peut afficher de manière conviviale pour l'utilisateur, tel que "409 - Impossible d'ajouter le nouvel utilisateur, ils existent déjà."

J'inclus ensuite les détails des conditions d'erreur dans le corps sous forme de code JSON afin que les développeurs d'interface utilisateur puissent essayer de faire des choix intelligents quant à ce qu'il convient de faire.

{
  "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

L'erreur n'appartient pas au corps. Il appartient à l'en-tête Warning.

L'en-tête HTTP général Warning contient des informations sur possible problèmes avec le statut du message.

Référence

0
B Seven