Codici di stato REST HTTP per convalida fallita o duplicato non valido

Sto costruendo un'applicazione con un'API basata su REST e sono arrivato al punto in cui sto specificando i codici di stato per ogni richiesta.

Quale codice di stato dovrei inviare per le richieste che falliscono la validazione o dove una richiesta sta cercando di aggiungere un duplicato nel mio database?

Ho guardato attraverso http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html ma nessuno di loro sembra giusto.

C'è una pratica comune quando si inviano i codici di stato?

Soluzione

Per il fallimento della convalida dell'input: 400 Bad Request + la tua descrizione opzionale. Questo è suggerito nel libro "RESTful Web Services". Per il doppio invio: 409 Conflitto


Aggiornamento giugno 2014

La specifica pertinente era RFC2616, che dava l'uso di 400 (Bad Request) in modo piuttosto stretto come La richiesta non può essere compresa dal server a causa di una sintassi malformata

Quindi si sarebbe potuto sostenere che era inappropriato per gli errori semantici. Ma non più; da giugno 2014 lo standard pertinente RFC 7231, che sostituisce il precedente RFC2616, dà l'uso di 400 (Bad Request) più ampiamente come il server non può o non elaborerà la richiesta a causa di qualcosa che è percepito come un errore del client

Commentari (11)
  • Convalida fallita: 403 Forbidden ("Il server ha capito la richiesta, ma si rifiuta di soddisfarla"). Contrariamente all'opinione popolare, RFC2616 non dice "403 è inteso solo per l'autenticazione fallita", ma "403: So cosa vuoi, ma non lo farò". Quella condizione può essere dovuta o meno all'autenticazione.
  • Cercando di aggiungere un duplicato: 409 Conflict ("La richiesta non può essere completata a causa di un conflitto con lo stato attuale della risorsa.")

Dovresti sicuramente dare una spiegazione più dettagliata nelle intestazioni e/o nel corpo della risposta (ad esempio con un'intestazione personalizzata - X-Status-Reason: Validation failed).

Commentari (19)

Raccomando codice di stato 422, "Unprocessable Entity".

11.2. 422 Entità non processabile

Il codice di stato 422 (Unprocessable Entity) significa che il server capisce il tipo di contenuto dell'entità richiesta (quindi un codice di stato 415(Unsupported Media Type) è inappropriato), e la sintassi dell'entità richiesta è corretta (quindi un codice di stato 400 (Bad Request) è inappropriato) ma non è stato in grado di elaborare le istruzioni contenute. Per esempio, questa condizione di errore può verificarsi se un corpo di richiesta XML contiene istruzioni XML ben formate (cioè sintatticamente corrette), ma semanticamente errate.

Commentari (14)