200
Ugh ... (309, 400, 403, 409, 415, 422) ... molte risposte cercando di indovinare, discutere e standardizzare qual è il miglior codice di ritorno per una richiesta HTTP corretta ma una chiamata REST fallita .
È errato mescolare codici di stato HTTP e codici di stato REST.
Tuttavia, ho visto molte implementazioni mescolarle e molti sviluppatori potrebbero non essere d'accordo con me.
I codici di ritorno HTTP sono correlati a HTTP Request
se stesso. Una chiamata REST viene eseguita utilizzando una richiesta del protocollo di trasferimento Hypertext e funziona a un livello inferiore rispetto al metodo REST richiamato stesso. REST è un concetto / approccio e il suo output è un risultato aziendale / logico , mentre il codice risultato HTTP è un trasporto .
Ad esempio, restituendo "404 Non trovato" quando si chiama / users / è confuso, perché può significare:
- URI errato (HTTP)
- Nessun utente trovato (REST)
"403 Proibito / Accesso negato" può significare:
- È richiesta un'autorizzazione speciale. I browser possono gestirlo chiedendo l'utente / password. (HTTP)
- Autorizzazioni di accesso errate configurate sul server. (HTTP)
- Devi essere autenticato (REST)
E l'elenco potrebbe continuare con "Errore del server 500" (un errore HTTP generato da Apache / Nginx o un errore di vincolo aziendale in REST) o altri errori HTTP ecc ...
Dal codice, è difficile capire quale fosse la ragione dell'errore, un errore HTTP (trasporto) o un errore REST (logico).
Se la richiesta HTTP è stata eseguita correttamente, dovrebbe sempre restituire 200 codice, indipendentemente dal record trovato o meno. Perché la risorsa URI è stata trovata ed è stata gestita dal server HTTP. Sì, potrebbe restituire un set vuoto. È possibile ricevere una pagina Web vuota con 200 come risultato HTTP, giusto?
Invece di questo puoi restituire 200 codice HTTP con alcune opzioni:
- Oggetto "errore" nel risultato JSON se qualcosa va storto
- Matrice / oggetto JSON vuota se nessun record trovato
- Un risultato bool / flag di successo in combinazione con le opzioni precedenti per una migliore gestione.
Inoltre, alcuni provider di servizi Internet potrebbero intercettare le tue richieste e restituirti un codice HTTP 404. Ciò non significa che i tuoi dati non vengano trovati, ma è qualcosa di sbagliato a livello di trasporto.
Da Wiki :
Nel luglio 2004, il fornitore di telecomunicazioni britannico BT Group ha implementato il sistema di blocco dei contenuti Cleanfeed, che restituisce un errore 404 a qualsiasi richiesta di contenuto identificata come potenzialmente illegale da Internet Watch Foundation. Altri ISP restituiscono un errore HTTP 403 "vietato" nelle stesse circostanze. La pratica di impiegare falsi errori 404 come mezzo per nascondere la censura è stata segnalata anche in Tailandia e Tunisia. In Tunisia, dove la censura era severa prima della rivoluzione del 2011, la gente divenne consapevole della natura dei falsi errori 404 e creò un personaggio immaginario chiamato "Ammar 404" che rappresenta "il censore invisibile".
Perché non rispondere semplicemente con qualcosa del genere?
{
"result": false,
"error": {"code": 102, "message": "Validation failed: Wrong NAME."}
}
Google restituisce sempre 200 come codice di stato nell'API di geocodifica, anche se la richiesta fallisce logicamente: https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes
Facebook restituisce sempre 200 per le richieste HTTP riuscite, anche se la richiesta REST fallisce: https://developers.facebook.com/docs/graph-api/using-graph-api/error-handling
È semplice, i codici di stato HTTP sono per richieste HTTP. L'API REST è tua, definisci i tuoi codici di stato.