Qual è un codice di stato HTTP appropriato da restituire da un servizio API REST per un errore di convalida?


394

Attualmente restituisco 401 Non autorizzato ogni volta che riscontro un errore di convalida nella mia applicazione API REST basata su Django / Piston . Dopo aver dato un'occhiata al registro dei codici di stato HTTP, non sono convinto che si tratti di un codice appropriato per un errore di convalida, cosa raccomandate?

  • 400 Richiesta non valida
  • 401 Non autorizzato
  • 403 proibito
  • 405 Metodo non consentito
  • 406 Non accettabile
  • 412 Condizione preliminare non riuscita
  • 417 Aspettativa fallita
  • 422 Entità non elaborabile
  • 424 Dipendenza non riuscita

Aggiornamento : "Errore di convalida" di cui sopra indica un errore di convalida dei dati a livello di applicazione, ad esempio datetime specificato in modo errato, indirizzo di posta elettronica fasullo ecc.


2
Dai un'occhiata a questa risposta: stackoverflow.com/a/2657624/221612
Kenny Meyer,

3
FWIW, collegamento di Kenny suggerisce il codice 422, come la risposta di Jim ora fa sotto . #TheMoreYouKnow #SavingYouAClick
ruffin

Penso che 401 sia più chiaro.
firma

Risposte:


298

Se "errore di convalida" indica che nella richiesta è presente un errore client, utilizzare HTTP 400 (Richiesta non valida). Ad esempio, se l'URI dovrebbe avere una data ISO-8601 e scopri che è nel formato sbagliato o si riferisce al 31 febbraio, allora restituiresti un HTTP 400. Idem se ti aspetti un XML ben formato in un corpo di entità e non riesce ad analizzare.

(1/2016): Negli ultimi cinque anni il più specifico HTTP 422 (Unprocessable Entity) di WebDAV è diventato un'alternativa molto ragionevole a HTTP 400. Vedi ad esempio il suo utilizzo nell'API JSON . Ma nota che HTTP 422 non è diventato HTTP 1.1, RFC-7231 .

I servizi Web RESTful di Richardson e Ruby contengono un'appendice molto utile su quando utilizzare i vari codici di risposta HTTP. Dicono:

400 ("Richiesta non valida")
Importanza: alta.
Questo è lo stato di errore generico lato client, utilizzato quando nessun altro codice di errore 4xx è appropriato. Viene comunemente utilizzato quando il client invia una rappresentazione insieme a una richiesta PUT o POST e la rappresentazione è nel formato corretto, ma non ha alcun senso. (p. 381)

e:

401 ("Non autorizzato")
Importanza: alta.
Il client ha tentato di operare su una risorsa protetta senza fornire le credenziali di autenticazione appropriate. Potrebbe aver fornito le credenziali sbagliate o nessuna. Le credenziali possono essere un nome utente e una password, una chiave API o un token di autenticazione, qualunque sia il servizio in questione. È comune per un client fare una richiesta per un URI e accettare un 401 solo per sapere quale tipo di credenziali inviare e in quale formato. [...]


3
Ma probabilmente se il formato URI non è valido, un 404 potrebbe essere più appropriato.
manu,

11
Come affermato da @ReWrite, penso anche che 422 sia meglio per errori di convalida.
Panteo,

11
Direi che è sbagliato. 400 Richiesta errata viene utilizzata quando c'è sintatticamente qualcosa di sbagliato nella richiesta. Direi che ReWrite ha ragione nel raccomandare 422 che riguarda il contenuto della richiesta.
Stijn de Witt,

3
@Kenji sì, 401 ("Non autorizzato"): "Potrebbe aver fornito credenziali errate ..." significa utente e / o password errati.
razzintown,

4
Gli errori @JimFerrans 400 sono per i casi in cui la sintassi fornita non è corretta. Gli errori 401 sono specifici se sto tentando di accedere a una pagina a cui devo accedere per accedere e non ho effettuato l'accesso. 422 errori indicano dove la sintassi è corretta, ma il server rifiuta il servizio. Nome utente / password errati sono sintassi corretta (non errore 400) e non sto tentando di accedere a una pagina per la quale devo effettuare l'accesso perché accedo alla stessa pagina di accesso (non errore 401). L'errore 401 dovrebbe essere usato per qualcosa come una pagina delle impostazioni a cui solo un utente può accedere
Zachary Weixelbaum

98

Da RFC 4918 (e anche documentato su http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml ):

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. 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.


6
Vorrei raccomandare 422 - Entità non elaborabile per errori di convalida oltre 400 - Richiesta non
valida


19

Ecco qui:

rfc2616 # section-10.4.1 - 400 Richiesta non valida

La richiesta non è stata compresa dal server a causa di una sintassi non corretta . Il client NON DOVREBBE ripetere la richiesta senza modifiche.

rfc7231 # section-6.5.1 - 6.5.1. 400 Richiesta non valida

Il codice di stato 400 (Richiesta errata ) indica che il server non può o non elabora la richiesta a causa di qualcosa che viene percepito come un errore del client (ad es. Sintassi della richiesta non valida, framing del messaggio di richiesta non valido o instradamento della richiesta ingannevole) .

Si riferisce a casi malformati (non ben formati)!

rfc4918 - 11.2. 422 Entità non elaborabile

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. 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 .

Conclusione

Regola empirica: [_] 00 copre il caso più generale e i casi che non sono coperti dal codice designato.

422 si adatta all'errore di convalida dell'oggetto migliore (precisamente la mia raccomandazione :)
Per quanto riguarda semanticamente errato - Pensa a qualcosa come la convalida "Questo nome utente esiste già".

400 viene utilizzato in modo errato per la convalida dell'oggetto


9

Direi che tecnicamente potrebbe non essere un errore HTTP, poiché la risorsa è stata (presumibilmente) validamente specificata, l'utente è stato autenticato e non si sono verificati errori operativi (tuttavia anche le specifiche includono alcuni codici riservati come 402 Pagamento richiesto che non sono ' sia in termini strettamente correlati all'HTTP, anche se potrebbe essere consigliabile averlo a livello di protocollo in modo che qualsiasi dispositivo possa riconoscere la condizione).

In tal caso, aggiungerei un campo di stato alla risposta con errori dell'applicazione, ad esempio

<status><code>4</code> <message> L'intervallo di date non è valido </message> </status>


1

Ci sono un po 'più di informazioni sulla semantica di questi errori in RFC 2616 , che documenta HTTP 1.1.

Personalmente, probabilmente lo userei 400 Bad Request, ma questa è solo la mia opinione personale senza alcun supporto fattuale.


0

Cosa intendi esattamente per "errore di convalida"? Cosa stai convalidando? Ti riferisci a qualcosa come un errore di sintassi (ad esempio XML non valido)?

In tal caso, direi che 400 Bad Request è probabilmente la cosa giusta, ma senza sapere che cosa stai "convalidando", è impossibile dirlo.


cosa succede se stiamo cercando di convalidare alcune convalide o regole aziendali.
Metalhead,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.