Jaki jest najbardziej odpowiedni kod stanu HTTP dla strony błędu „Nie znaleziono elementu”

117

Jestem ciekaw, jaki jest najbardziej odpowiedni kod stanu HTTP dla strony „element nie istnieje”.

Jeśli sama strona nie istnieje, oczywiście użyję 404. Jednak jedna z moich stron ma useridargument (jest to strona „edytuj użytkownika”) i jeśli nie istnieje żaden użytkownik o podanym identyfikatorze użytkownika, wyświetlam stronę błędu, ale chciałbym również wysłać nagłówek statusu 4xx (ponieważ „200 OK” tak naprawdę nie pasuje).

Wydaje mi się, że 404 byłby w porządku, ponieważ jest to „nie znaleziono”, a nie „nie znaleziono pliku”, ale zastanawiam się, czy istnieje lepszy kod dla tego przypadku.

ThiefMaster
źródło

Odpowiedzi:

140

Zbyt sprytne podejście do niejasnych kodów błędów HTTP to zły pomysł. Przeglądarki czasami reagują w niekorzystny sposób, który zaciemnia sytuację. Trzymaj się 404.

bmargulies
źródło
14
Cholera za udzielenie dobrych rad :( OCD, aby nie 404, wszystko jest prawdziwe.
Carrie Kendall
16
Błędy 404 są nieco niejednoznaczne w przypadku różnicowania złego identyfikatora URI od nieznalezionej jednostki. Potrzebny jest nowy standardowy kod do ujednoznacznienia 404.
Breakskater
2
Wolę zwrócić 204 pustą zawartość niż zwrócić kod stanu
ambigus
46

Kod powrotu 404 w rzeczywistości oznacza „nie znaleziono zasobu” i ma zastosowanie do każdego podmiotu, dla którego żądanie zostało wysłane, ale nie zostało spełnione. Działa więc równie dobrze w przypadku stron, podsekcji stron i każdego elementu istniejącego na stronie, który ma określone żądanie renderowania.

Tak więc 404 to właściwy kod do użycia w tym scenariuszu. Zwróć uwagę, że nie dotyczy to „nie znaleziono serwera”, czyli innej sytuacji, w której żądanie zostało wysłane, ale nie otrzymano żadnej odpowiedzi, w przeciwieństwie do odpowiedzi, ale bez żądanego zasobu.

Ośmiobitowy Guru
źródło
1
Co jeśli chcę zaktualizować obiekt foo o id = 1, aw bazie danych nie ma foo o tym id?
valijon
1
W tym scenariuszu masz problem ze współbieżnością do naprawienia: jeśli pobrałeś obiekt z id = 1 i już go nie ma, gdy próbujesz go zaktualizować, inny wątek lub proces zignorował twoją blokadę (lub jej nie ustawiłeś) i usunąłem go. To nie jest dobrze. Alternatywnie, jeśli próbujesz zaktualizować obiekt id = n (gdzie n jest dostarczane) bez uprzedniego sprawdzenia, czy istnieje, brakuje kroku weryfikacji w logice aktualizacji, co również nie jest dobre.
Eight-Bit Guru
8

Zależy to od tego, czy identyfikator użytkownika jest identyfikatorem zasobu czy dodatkowym parametrem. Jeśli tak, możesz zwrócić 404, jeśli nie, możesz zwrócić inny kod, taki jak

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

Więcej informacji w darmowym InfoQ Explores: książka REST .

cetnar
źródło
1
Mówiąc „dodatkowy parametr” masz na myśli pole nagłówka żądania? W przeciwnym razie nie polecałbym używania 412. „Kod stanu 412 (warunek wstępny nie powiódł się) wskazuje, że co najmniej jeden warunek podany w polach nagłówka żądania został oceniony jako fałszywy podczas testowania na serwerze.”
oferei