¿Descansar mensaje de error en el encabezado HTTP o el cuerpo de respuesta?

82

Tengo un servicio REST que está expuesto a clientes de iPhone y Android. Actualmente sigo los códigos HTTP 200, 400, 401, 403, 404, 409, 500 etc.

Mi pregunta es ¿dónde está el lugar recomendado para poner el motivo / descripción / causa del error? ¿Tiene más sentido que la API REST siempre tenga un motivo personalizado en el encabezado como ese?

< 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

¿O es mejor tenerlo en el cuerpo de respuesta a través de 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" }
James Cowhen
fuente
6
Hoy en día, es una práctica común agregar encabezados personalizados, como 'X-HTTP-Error-Description: Missing required parameters'.
andreszs

Respuestas:

94

Citando la especificación HTTP para códigos de error 400.x:

La clase 4xx de código de estado está destinada a casos en los que el cliente parece haberse equivocado. Excepto cuando se responde a una solicitud HEAD, el servidor DEBE incluir una entidad que contenga una explicación de la situación de error y si se trata de una condición temporal o permanente. Estos códigos de estado son aplicables a cualquier método de solicitud. Los agentes de usuario DEBERÍAN mostrar al usuario cualquier entidad incluida.

Es una buena práctica incluir el mensaje de error como una entidad en el cuerpo de la respuesta HTTP, ya sea JSON, texto sin formato, HTML formateado o cualquier otro formato que desee utilizar.

Percepción
fuente
24

Es mejor tener detalles de error en el cuerpo. Además, muchos (la mayoría / casi todos, por ejemplo, WSGI) servidores y clientes no admiten cambiar el nombre del código de error; trátelos como pares fijos (por ejemplo, 400 es siempre "Solicitud incorrecta" y no "Solicitud incorrecta - Usted Olvidé especificar el ID de usuario "). Incluso si no se rompen, no les importará su nombre especial para el código de error específico.

Tadeck
fuente
3

El error no pertenece al cuerpo. Pertenece al encabezado Advertencia.

El encabezado HTTP general Warning contiene información sobre posibles problemas con el estado del mensaje.

Referencia

B siete
fuente
3
Sería bueno usar un encabezado "oficial" para esto. Sin embargo, Warningcomo sugiere el nombre, no es para errores. El RFC (7234) dice:> El uso de una advertencia, en lugar de un código de estado de error, distingue estas respuestas de las fallas verdaderas.
Frans
1
Nota: El encabezado Advertencia pronto quedará obsoleto; consulte Advertencia ( github.com/httpwg/http-core/issues/139 ) y Advertencia: header & stale-while-revalidate ( github.com/whatwg/fetch/issues/913 ) para obtener más detalles.
Bizmarck