400 Richiesta non valida ora sembra essere il miglior codice di stato HTTP / 1.1 per il tuo caso d'uso.
Al momento della tua domanda (e della mia risposta originale), RFC 7231 non era una cosa; a quel punto mi sono opposto 400 Bad Request
perché RFC 2616 diceva (con enfasi la mia):
La richiesta non è stata compresa dal server a causa di una sintassi non corretta .
e la richiesta che descrivi è JSON sintatticamente valida racchiusa in HTTP sintatticamente valido, e quindi il server non ha problemi con la sintassi della richiesta.
Tuttavia, come sottolineato da Lee Saferite nei commenti , RFC 7231, che viola RFC 2616, non include tale restrizione :
Il codice di stato 400 (Richiesta non valida) indica che il server non può o non elabora la richiesta a causa di qualcosa che viene percepito come un errore client (ad es. Sintassi della richiesta non valida, framing del messaggio di richiesta non valido o instradamento della richiesta ingannevole).
Tuttavia, prima di quella riformulazione (o se si desidera cavillare sul fatto che RFC 7231 sia solo uno standard proposto in questo momento), 422 Unprocessable Entity
non sembra un codice di stato HTTP errato per il proprio caso d'uso, perché come dice l'introduzione a RFC 4918:
Mentre i codici di stato forniti da HTTP / 1.1 sono sufficienti per descrivere la maggior parte delle condizioni di errore riscontrate dai metodi WebDAV, ci sono alcuni errori che non rientrano perfettamente nelle categorie esistenti. Questa specifica definisce codici di stato extra sviluppati per i metodi WebDAV (Sezione 11)
E la descrizione di422
dice:
Il codice di stato 422 (entità non elaborabile) indica che il server comprende il tipo di contenuto dell'entità richiesta (quindi un codice di stato 415 (tipo di supporto non supportato) è inappropriato) e la sintassi dell'entità richiesta è corretta (quindi un 400 (richiesta non valida) ) il codice di stato non è appropriato) ma non è stato in grado di elaborare le istruzioni contenute.
(Nota il riferimento alla sintassi; sospetto che 7231 in parte oscilli anche 4918)
Questo suona esattamente come la tua situazione, ma nel caso in cui ci fossero dei dubbi, continua dicendo:
Ad esempio, questa condizione di errore può verificarsi se un corpo di richiesta XML contiene istruzioni XML ben formate (cioè sintatticamente corrette), ma semanticamente errate.
(Sostituisci "XML" con "JSON" e penso che possiamo essere d'accordo sulla tua situazione)
Ora, alcuni obietteranno che RFC 4918 riguarda "Estensioni HTTP per Web Distributed Authoring and Versioning (WebDAV)" e che tu (presumibilmente) non stai facendo nulla che coinvolga WebDAV, quindi non dovresti usare cose da esso.
Data la scelta tra l'utilizzo di un codice di errore nello standard originale che non copre esplicitamente la situazione e uno di un'estensione che descriva esattamente la situazione, sceglierei quest'ultimo.
Inoltre, la Sezione 21.4 di RFC 4918 fa riferimento al registro dei codici di stato HTTP (Hypertext Transfer Protocol) IANA , dove è possibile trovare 422.
Propongo che sia assolutamente ragionevole per un client o un server HTTP utilizzare qualsiasi codice di stato da quel registro, purché lo faccia correttamente.
Ma a partire da HTTP / 1.1, RFC 7231 ha trazione, quindi basta usare 400 Bad Request
!