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