Qual è il codice di stato HTTP più appropriato per una pagina di errore "elemento non trovato"


117

Sono curioso di sapere quale sia il codice di stato HTTP più appropriato per una pagina "l'elemento non esiste".

Se la pagina stessa non esiste, userò ovviamente 404. Tuttavia, una delle mie pagine ha un useridargomento (è una pagina "modifica utente") e nel caso in cui non esista alcun utente con l'ID utente specificato, sto visualizzando un pagina di errore, ma vorrei anche inviare un'intestazione di stato 4xx (poiché "200 OK" non si adatta perfettamente).

Immagino che 404 andrebbe bene dato che è "non trovato" e non "file non trovato", ma mi chiedo se ci sia un codice migliore per questo caso.

Risposte:


139

Diventare troppo intelligenti con codici di errore HTTP oscuri è una cattiva idea. I browser a volte reagiscono in modi inutili che offuscano la situazione. Attenersi al 404.


14
Accidenti a te per aver dato un buon consiglio :( L'OCD per non 404 tutte le cose è reale però.
Carrie Kendall

16
Gli errori 404 sono alquanto ambigui per differenziare un URI non valido da un'entità non trovata. È necessario un nuovo codice standard per disambiguare i 404.
Breakskater

2
Preferisco restituire 204 contenuti vuoti piuttosto che restituire un codice di stato
ambigus

46

Un codice di ritorno 404 in realtà significa "risorsa non trovata" e si applica a qualsiasi entità per cui è stata effettuata una richiesta ma non soddisfatta. Quindi funziona altrettanto bene per le pagine, le sottosezioni di pagine e qualsiasi elemento presente sulla pagina che ha una richiesta specifica da rendere.

Quindi 404 è il codice giusto da usare in questo scenario. Nota che non si applica a "server non trovato", che è una situazione diversa in cui una richiesta è stata emessa ma non ha ricevuto alcuna risposta, al contrario di una risposta ma senza la risorsa richiesta.


1
Cosa succede se voglio aggiornare l'oggetto foo con id = 1 e non c'è foo nel database con questo id?
valijon

1
In questo scenario, hai un problema di concorrenza da risolvere: se hai recuperato un oggetto con id = 1 e non esiste più quando provi ad aggiornarlo, qualche altro thread o processo ha ignorato il tuo blocco (o non ne hai impostato uno) e cancellato. Questo non è buono. In alternativa, se stai tentando di aggiornare object id = n (dove n ti viene fornito) senza prima verificare che esista, ti manca un passaggio di convalida nella logica di aggiornamento, il che non va bene.
Guru a otto bit


8

Ciò dipende se l'ID utente è un identificatore di risorsa o un parametro aggiuntivo. Se lo è, allora va bene restituire 404, altrimenti potresti restituire un altro codice come

400 (bad request) ‐ indicates a bad request
o
412 (Precondition Failed) e.g. conflict by performing conditional update

Maggiori informazioni nel libro InfoQ Explores: REST .


1
Dicendo "parametro aggiuntivo" intendi il campo di intestazione della richiesta? In caso contrario, non consiglierei di utilizzare 412. "Il codice di stato 412 (Precondizione non riuscita) indica che una o più condizioni fornite nei campi dell'intestazione della richiesta sono state valutate come false quando testate sul server."
oferei il
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.