Estoy tratando de averiguar cuál es el código de estado correcto para devolver en diferentes escenarios con una API "REST-like" en la que estoy trabajando. Digamos que tengo un punto final que permite POST'ing compras en formato JSON. Se parece a esto:
{
"account_number": 45645511,
"upc": "00490000486",
"price": 1.00,
"tax": 0.08
}
¿Qué debo devolver si el cliente me envía "sales_tax" (en lugar del "impuesto" esperado)? Actualmente, estoy devolviendo un 400. Pero, comencé a cuestionarme sobre esto. ¿Realmente debería devolver un 422? Quiero decir, es JSON (que es compatible) y es JSON válido, simplemente no contiene todos los campos obligatorios.
rest
http-status-codes
David S
fuente
fuente
Respuestas:
400 Bad Request ahora parece ser el mejor código de estado HTTP / 1.1 para su caso de uso.
En el momento de su pregunta (y mi respuesta original), RFC 7231 no era una cosa; en ese momento me opuse
400 Bad Request
porque RFC 2616 dijo (con énfasis el mío):y la solicitud que describe es JSON sintácticamente válida encerrada en HTTP sintácticamente válida y, por lo tanto, el servidor no tiene problemas con la sintaxis de la solicitud.
Sin embargo, como lo señaló Lee Saferite en los comentarios , RFC 7231, que obsoleta RFC 2616, no incluye esa restricción :
Sin embargo, antes de esa nueva redacción (o si desea objetar que RFC 7231 solo es un estándar propuesto en este momento),
422 Unprocessable Entity
no parece un código de estado HTTP incorrecto para su caso de uso, porque como dice la introducción a RFC 4918:Y la descripción de
422
dice:(Tenga en cuenta la referencia a la sintaxis; sospecho que 7231 también está parcialmente obsoleto 4918)
Esto suena exactamente como su situación, pero en caso de que haya alguna duda, continúa diciendo:
(Reemplace "XML" con "JSON" y creo que podemos estar de acuerdo en que es su situación)
Ahora, algunos objetarán que RFC 4918 se trata de "Extensiones HTTP para Autorización y Versiones Distribuidas en la Web (WebDAV)" y que (presumiblemente) no está haciendo nada que involucre a WebDAV, por lo que no debería usar cosas de él.
Dada la opción entre usar un código de error en el estándar original que explícitamente no cubre la situación, y uno de una extensión que describe la situación exactamente, elegiría el último.
Además, RFC 4918 Sección 21.4 se refiere al Registro de Código de Estado del Protocolo de Transferencia de Hipertexto (HTTP) de la IANA , donde se puede encontrar 422.
Propongo que es totalmente razonable que un cliente o servidor HTTP use cualquier código de estado de ese registro, siempre que lo hagan correctamente.
Pero a partir de HTTP / 1.1, RFC 7231 tiene tracción, ¡así que solo úselo
400 Bad Request
!fuente
400 Bad Request es el código de estado HTTP adecuado para su caso de uso. El código está definido por HTTP / 0.9-1.1 RFC.
http://tools.ietf.org/html/rfc2616#section-10.4.1
422 Entidad no procesable se define por RFC 4918 - WebDav. Tenga en cuenta que hay una ligera diferencia en comparación con 400, consulte el texto citado a continuación.
Para mantener una interfaz uniforme, debe usar 422 solo en un caso de respuestas XML y también debe admitir todos los códigos de estado definidos por la extensión Webdav, no solo 422.
http://tools.ietf.org/html/rfc4918#page-78
Ver también la publicación de Mark Nottingham sobre códigos de estado:
Cómo pensar en los códigos de estado HTTP
fuente
The following status codes are added to those defined in HTTP/1.1 [RFC2616].
Para reflejar el estado a partir de 2015:
Comportamiento, tanto los códigos de respuesta 400 como 422 serán tratados de la misma manera por clientes e intermediarios, por lo que en realidad no hay una diferencia concreta con el uso.
Sin embargo, esperaría ver 400 actualmente utilizados más ampliamente, y además las aclaraciones que proporciona la especificación HTTPbis hacen que sea el más apropiado de los dos códigos de estado:
Para el contexto, HTTPbis es una revisión de la especificación HTTP / 1.1 que intenta aclarar áreas que no eran claras o inconsistentes. Una vez que haya alcanzado el estado aprobado, reemplazará a RFC2616.
fuente
Estudio de caso: API de GitHub
https://developer.github.com/v3/#client-errors
Tal vez copiar de API conocidas es una buena idea:
fuente
No hay una respuesta correcta, ya que depende de cuál sea la definición de "sintaxis" para su solicitud. Lo más importante es que tú:
Antes de que todos salten sobre mí por decir que no hay una respuesta correcta o incorrecta aquí, déjenme explicarles un poco cómo llegué a la conclusión.
En este ejemplo específico, la pregunta del OP se trata de una solicitud JSON que contiene una clave diferente de la esperada. Ahora, el nombre de la clave recibida es muy similar, desde el punto de vista del lenguaje natural, a la clave esperada, pero es, estrictamente, diferente y, por lo tanto, (generalmente) no es reconocido por una máquina como equivalente.
Como dije anteriormente, el factor decisivo es lo que se entiende por sintaxis . Si la solicitud se envió con un Tipo de contenido de
application/json
, entonces sí, la solicitud es sintácticamente válida porque es una sintaxis JSON válida, pero no semánticamente válida, ya que no coincide con lo esperado. (suponiendo una definición estricta de lo que hace que la solicitud en cuestión sea semánticamente válida o no).Si, por otro lado, la solicitud se envió con un Tipo de contenido personalizado más específico como
application/vnd.mycorp.mydatatype+json
ese, quizás, especifica exactamente qué campos se esperan, entonces diría que la solicitud podría ser sintácticamente inválida, de ahí la respuesta 400.En el caso en cuestión, dado que la clave era incorrecta, no el valor , hubo un error de sintaxis si había una especificación de qué claves son válidas. Si no hubiera especificación para claves válidas, o si el error fue con un valor , entonces sería un error semántico .
fuente
https://www.keycdn.com/support/422-unprocessable-entity/
fuente
Su caso:
HTTP 400
es el código de estado correcto para su caso desde la perspectiva REST, ya que es sintácticamente incorrecto enviar ensales_tax
lugar detax
, aunque es un JSON válido. Normalmente, la mayoría de los marcos del lado del servidor aplican esto al asignar el JSON a los objetos. Sin embargo, hay algunas implementaciones REST que ignoran las novedadeskey
en el objeto JSON. En ese caso, unacontent-type
especificación personalizada para aceptar solo campos válidos puede ser aplicada por el lado del servidor.Escenario ideal para 422:
En un mundo ideal, 422 es preferible y generalmente aceptable para enviar como respuesta si el servidor comprende el tipo de contenido de la entidad de solicitud y la sintaxis de la entidad de solicitud es correcta pero no pudo procesar los datos porque es semánticamente errónea.
Situaciones de 400 sobre 422:
Recuerde, el código de respuesta 422 es un código de estado HTTP (WebDAV) extendido. Todavía hay algunos clientes HTTP / bibliotecas front-end que no están preparados para manejar 422. Para ellos, es tan simple como "HTTP 422 está mal, porque no es HTTP" . Desde la perspectiva del servicio, 400 no es muy específico.
En la arquitectura empresarial, los servicios se implementan principalmente en capas de servicios como SOA, IDM, etc. Por lo general, atienden a múltiples clientes que van desde un cliente nativo muy antiguo hasta los últimos clientes HTTP. Si uno de los clientes no maneja HTTP 422, las opciones son pedirle al cliente que actualice o cambie su código de respuesta a HTTP 400 para todos. En mi experiencia, esto es muy raro en estos días, pero sigue siendo una posibilidad. Por lo tanto, siempre se requiere un estudio cuidadoso de su arquitectura antes de decidir sobre los códigos de respuesta HTTP.
Para manejar situaciones como estas, las capas de servicio normalmente usan
versioning
o configuran unconfiguration
indicador para que los clientes de conformidad HTTP estrictos envíen 400 y envíen 422 para el resto de ellos. De esta forma, brindan compatibilidad de compatibilidad con versiones anteriores para los consumidores existentes, pero al mismo tiempo brindan la capacidad para que los nuevos clientes consuman HTTP 422.La última actualización de RFC7321 dice:
Esto confirma que los servidores pueden enviar HTTP 400 para solicitudes no válidas. 400 ya no se refiere solo al error de sintaxis , sin embargo, 422 sigue siendo una respuesta genuina siempre que los clientes puedan manejarlo.
fuente
En primer lugar, esta es una muy buena pregunta.
400 Solicitud incorrecta: cuando falta una información crítica en la solicitud
por ejemplo, el encabezado de autorización o el encabezado de tipo de contenido. Lo cual es absolutamente requerido por el servidor para entender la solicitud. Esto puede diferir de un servidor a otro.
422 Entidad no procesable: cuando el cuerpo de la solicitud no se puede analizar.
Esto es menos severo que 400. La solicitud ha llegado al servidor. El servidor ha reconocido que la solicitud tiene la estructura básica correcta. Pero la información en el cuerpo de la solicitud no se puede analizar ni comprender.
por ejemplo,
Content-Type: application/xml
cuando el cuerpo de la solicitud es JSON.Aquí hay un artículo que enumera los códigos de estado y su uso en las API REST. https://metamug.com/article/status-codes-for-rest-api.php
fuente
En realidad, debe devolver "200 OK" y en el cuerpo de la respuesta incluir un mensaje sobre lo que sucedió con los datos publicados. Entonces depende de su aplicación entender el mensaje.
La cuestión es que los códigos de estado HTTP son exactamente eso: códigos de estado HTTP. Y están destinados a tener significado solo en la capa de transporte, no en la capa de aplicación. La capa de aplicación nunca debería saber que se está utilizando HTTP. Si cambió su capa de transporte de HTTP a Homing Pigeons, no debería afectar su capa de aplicación de ninguna manera.
Déjame darte un ejemplo no virtual. Digamos que te enamoras de una chica y ella te ama, pero su familia se muda a un país completamente diferente. Ella te da su nueva dirección de correo postal. Naturalmente, decides enviarle una carta de amor. Entonces escribe su carta, la pone en un sobre, escribe su dirección en el sobre, le pone un sello y la envía. Ahora consideremos estos escenarios
En resumen: devolver "200 OK" no significa que la aplicación del servidor tenga buenas noticias para usted. Solo significa que tiene algunas noticias.
PD: El código de estado 422 solo tiene un significado en el contexto de WebDAV. Si no está trabajando con WebDAV, entonces 422 tiene exactamente el mismo significado estándar que cualquier otro código no estándar = que no es ninguno.
fuente