Código de estado HTTP correcto a entrada incorrecta

170

¿Cuál es el código de respuesta HTTP óptimo cuando no se informa 200 (todo está bien) pero error en la entrada?

Por ejemplo, envía algunos datos al servidor y responderá que sus datos son incorrectos

el uso se 500parece más al problema del servidor que se
usa 200con el texto de advertencia / respuesta de error es malo (que permite el almacenamiento en caché y no todo está bien) el
uso 204y la devolución de nada, tal vez sea bueno (pero ¿está bien soportado?) el
uso 404es incorrecto si la ruta solicitada (script) está disponible y en el lugar apropiado

Marek Sebera
fuente
Vea mi respuesta para más detalles stackoverflow.com/a/59527615/4127230
shiva2492

Respuestas:

211

Tuvimos el mismo problema al hacer nuestra API también. Estábamos buscando un código de estado HTTP equivalente a un InvalidArgumentException. Después de leer el artículo fuente a continuación, terminamos usando 422 Unprocessable Entityqué estados:

El código de estado 422 (entidad no procesable) significa que el servidor comprende el tipo de contenido de la entidad de solicitud (por lo tanto, un código de estado 415 (tipo de medio no admitido) es inapropiado) y la sintaxis de la entidad de solicitud es correcta (por lo tanto, un 400 (solicitud incorrecta) ) el código de estado es inapropiado) pero no pudo procesar las instrucciones contenidas. Por ejemplo, esta condición de error puede ocurrir si un cuerpo de solicitud XML contiene instrucciones XML bien formadas (es decir, sintácticamente correctas), pero semánticamente erróneas.

fuente: https://www.bennadel.com/blog/2434-http-status-codes-for-invalid-data-400-vs-422.htm

Keego
fuente
138

Los códigos que comienzan con 4 (4xx) están destinados a errores del cliente. ¿Quizás 400 (Bad Request) podría ser adecuado para este caso? La definición en http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html dice:

"El servidor no pudo entender la solicitud debido a una sintaxis incorrecta. El cliente NO DEBE repetir la solicitud sin modificaciones".

esaj
fuente
13
400 Bad Requestno está mal, pero generalmente debe reservarse para la sintaxis con formato incorrecto. OP parece estar más preocupado por un caso con una sintaxis bien formada pero con valores no válidos. Plus 400 es un código de respuesta bastante común "oh, mierda, algo no estaba bien", que quizás desee diferenciar de un caso particular de entrada errónea.
Keego
44
Tenga en cuenta que la redacción se actualizó en RFC 7231, y que "El servidor no pudo entender la solicitud debido a una sintaxis incorrecta" se actualizó a "el servidor no puede o no procesará la solicitud debido a algo que se percibe como un cliente error (por ejemplo, sintaxis de solicitud con formato incorrecto, enmarcado de mensaje de solicitud no válido o enrutamiento de solicitud engañoso) ".
Calimo
14

Además de las especificaciones RFC , también puede ver esto en acción. Mira las respuestas de Twitter.

https://developer.twitter.com/en/docs/ads/general/guides/response-codes

Multitud
fuente
19
Puede obtener más votos a favor si saca ejemplos de sus enlaces.
Jared Thirsk
He dado ejemplo en mi publicación stackoverflow.com/a/59527615/4127230
shiva2492
1
Para mí, el enlace ( fb-developers.info/tech/fb_dev/faq/general/gen_10.html ) conduce a un anuncio aleatorio. Creo que el dominio fue falsificado
dmitry502
@ dmitry502 Respondido editado para eliminar el enlace falso. Gracias por tu comentario
Francis
9

409 Conflict Podría ser una solución aceptable.

De acuerdo con: https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

La solicitud no se pudo completar debido a un conflicto con el estado actual del recurso. Este código solo se permite en situaciones en las que se espera que el usuario pueda resolver el conflicto y volver a enviar la solicitud. El cuerpo de respuesta DEBE incluir suficiente información para que el usuario reconozca la fuente del conflicto. Idealmente, la entidad de respuesta incluiría suficiente información para que el usuario o agente de usuario solucione el problema; sin embargo, eso podría no ser posible y no es obligatorio.

El documento continúa con un ejemplo:

Es más probable que ocurran conflictos en respuesta a una solicitud PUT. Por ejemplo, si se usaban versiones y la entidad que se PUT incluía cambios en un recurso que entran en conflicto con los realizados por una solicitud anterior (de terceros), el servidor podría usar la respuesta 409 para indicar que no puede completar la solicitud . En este caso, la entidad de respuesta probablemente contendría una lista de las diferencias entre las dos versiones en un formato definido por el Tipo de contenido de respuesta.


En mi caso, me gustaría PONER una cadena, que debe ser única, a una base de datos a través de una API. Antes de agregarlo a la base de datos, estoy verificando que no esté en la base de datos.

Si es así, volveré "Error: The string is already in the database", 409.

Creo que esto es lo que quería el OP: un código de error adecuado para cuando los datos no pasan los criterios del servidor.

Alex Fortin
fuente
2

De acuerdo con el siguiente escenario,

Digamos que alguien realiza una solicitud a su servidor con datos que están en el formato correcto, pero que simplemente no son datos "buenos". Entonces, por ejemplo, imagine que alguien publicó un valor de cadena en un punto final de API que esperaba un valor de cadena; pero, el valor de la cadena contenía datos que estaban en la lista negra (por ejemplo, evitar que las personas usen "contraseña" como contraseña). entonces el código de estado podría ser 400 o 422?

Hasta ahora, habría devuelto una "400 Solicitud incorrecta", que, según w3.org, significa:

El servidor no pudo entender la solicitud debido a una sintaxis incorrecta. El cliente NO DEBE repetir la solicitud sin modificaciones.

Esta descripción no se ajusta a las circunstancias; pero, si sigue la lista de códigos de estado HTTP centrales definidos en el protocolo HTTP / 1.1, probablemente sea su mejor opción.

Recientemente, sin embargo, alguien de mi equipo de desarrollo me señaló [a mí] que las API populares están comenzando a usar extensiones HTTP para volverse más granulares con sus informes de errores. Específicamente, muchas API, como Twitter y Recurly, están utilizando el código de estado "422 Entidad no procesable" como se define en la extensión HTTP para WebDAV. El código de estado HTTP 422 dice:

El código de estado 422 (entidad no procesable) significa que el servidor comprende el tipo de contenido de la entidad de solicitud (por lo tanto, un código de estado 415 (tipo de medio no admitido) es inapropiado) y la sintaxis de la entidad de solicitud es correcta (por lo tanto, un 400 (solicitud incorrecta) ) el código de estado es inapropiado) pero no pudo procesar las instrucciones contenidas Por ejemplo, esta condición de error puede ocurrir si un cuerpo de solicitud XML contiene instrucciones XML bien formadas (es decir, sintácticamente correctas), pero semánticamente erróneas.

Volviendo a nuestro ejemplo de contraseña de arriba, este código de estado 422 se siente mucho más apropiado. El servidor comprende lo que estás intentando hacer; y comprende los datos que está enviando; simplemente no permitirá que se procesen esos datos.

shiva2492
fuente
-7

404 - No encontrado - se puede usar para El URI solicitado no es válido o el recurso solicitado, como un usuario, no existe.

usuario
fuente
2
El OP ya descartó eso: " usar 404 es incorrecto si la ruta (script) solicitada está disponible y en el lugar adecuado "
Remy Lebeau