400 Solicitação incorreta agora parece ser o melhor código de status HTTP / 1.1 para o seu caso de uso.
No momento da sua pergunta (e da minha resposta original), a RFC 7231 não era uma coisa; Nesse ponto, opus-me 400 Bad Request
porque a RFC 2616 disse (com ênfase minha):
A solicitação não pôde ser entendida pelo servidor devido à sintaxe incorreta .
e a solicitação que você descreve é JSON sintaticamente válido, envolto em HTTP sintaticamente válido e, portanto, o servidor não tem problemas com a sintaxe da solicitação.
No entanto, como apontado por Lee Saferite nos comentários , a RFC 7231, que obsoleta a RFC 2616, não inclui essa restrição :
O código de status 400 (Solicitação incorreta) indica que o servidor não pode ou não processará a solicitação devido a algo que é considerado um erro do cliente (por exemplo, sintaxe de solicitação malformada, enquadramento de mensagem de solicitação inválida ou roteamento de solicitação enganoso).
No entanto, antes dessa reformulação (ou se você quiser discutir sobre o RFC 7231 ser apenas um padrão proposto no momento), 422 Unprocessable Entity
não parece um código de status HTTP incorreto para o seu caso de uso, porque, como diz a introdução ao RFC 4918:
Embora os códigos de status fornecidos pelo HTTP / 1.1 sejam suficientes para descrever a maioria das condições de erro encontradas pelos métodos WebDAV, existem alguns erros que não se enquadram perfeitamente nas categorias existentes. Esta especificação define códigos de status extras desenvolvidos para métodos WebDAV (Seção 11)
E a descrição do422
diz:
O código de status 422 (Entidade não processável) significa que o servidor entende o tipo de conteúdo da entidade solicitada (portanto, um código de status 415 (Tipo de mídia não suportado) é inadequado) e a sintaxe da entidade solicitada está correta (portanto, 400 (Solicitação incorreta) ) código de status é inapropriado), mas não conseguiu processar as instruções contidas.
(Observe a referência à sintaxe; suspeito 7231 parcialmente obsoleto 4918 também)
Isso soa exatamente como a sua situação, mas, para o caso de haver alguma dúvida, continua dizendo:
Por exemplo, essa condição de erro pode ocorrer se um corpo de solicitação XML contiver instruções XML bem formadas (ou seja, sintaticamente corretas), mas semanticamente erradas.
(Substitua "XML" por "JSON" e acho que podemos concordar que essa é a sua situação)
Agora, alguns argumentarão que o RFC 4918 é sobre "Extensões HTTP para criação e versão distribuída na Web (WebDAV)" e que você (presumivelmente) não está fazendo nada que envolva o WebDAV, portanto, não deve usar nada disso.
Dada a escolha entre usar um código de erro no padrão original que explicitamente não cobre a situação, e um de uma extensão que descreve exatamente a situação, eu escolheria o último.
Além disso, a Seção 21.4 da RFC 4918 refere-se ao Registro de Código de Status HTTP (IANA Hypertext Transfer Protocol) , onde 422 podem ser encontrados.
Proponho que seja totalmente razoável que um cliente ou servidor HTTP use qualquer código de status desse registro, desde que o faça corretamente.
Mas a partir do HTTP / 1.1, o RFC 7231 tem tração, então use 400 Bad Request
!