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):
El servidor no pudo entender la solicitud debido a una sintaxis incorrecta .
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 :
El código de estado 400 (Solicitud incorrecta) indica que el servidor no puede o no procesará la solicitud debido a algo que se percibe como un error del cliente (por ejemplo, sintaxis de solicitud con formato incorrecto, enmarcado de mensaje de solicitud no válido o enrutamiento de solicitud engañoso).
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:
Si bien los códigos de estado proporcionados por HTTP / 1.1 son suficientes para describir la mayoría de las condiciones de error encontradas por los métodos de WebDAV, hay algunos errores que no encajan perfectamente en las categorías existentes. Esta especificación define códigos de estado adicionales desarrollados para métodos WebDAV (Sección 11)
Y la descripción de422
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.
(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:
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.
(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
!