"Öğe bulunamadı" hata sayfası için en uygun HTTP durum kodu nedir


117

Bir "öğe yok" sayfası için en uygun HTTP durum kodunun ne olduğunu merak ediyorum.

Sayfanın kendisi mevcut değilse, açıkça 404 kullanacağım. Bununla birlikte, sayfalarımdan birinde bir useridbağımsız değişken var (bu bir "kullanıcıyı düzenle" sayfasıdır) ve verilen kullanıcı kimliğine sahip bir kullanıcı yoksa, bir hata sayfası, ancak ayrıca bir 4xx durum başlığı göndermek istiyorum ("200 OK" gerçekten sığmadığından).

Sanırım 404, "bulunamadı" ve "dosya bulunamadı" olmadığı için uygun olur, ancak bu durum için daha iyi bir kod olup olmadığını merak ediyorum.

Yanıtlar:


140

Belirsiz HTTP hata kodlarıyla aşırı akıllı davranmak kötü bir fikirdir. Tarayıcılar bazen durumu gizleyen yardımcı olmayan şekillerde tepki verir. 404 ile devam et.


14
İyi öğüt verdiğin için sana lanet olsun :( OKB'nin her şeyi 404 yapmamasına rağmen gerçek.
Carrie Kendall

16
404 hataları, hatalı bir URI ile bulunamadı varlık arasında ayrım yapmak için biraz belirsizdir. 404'lerin belirsizliğini gidermek için yeni bir standart kod gereklidir.
Breakskater

2
Bir belirsiz durum kodu döndürmektense 204 boş içeriği döndürmeyi tercih ederim
hsnslh

46

Bir 404 dönüş kodu aslında 'kaynak bulunamadı' anlamına gelir ve kendisi için bir talebin yapıldığı ancak karşılanmayan herhangi bir varlık için geçerlidir. Bu nedenle, sayfalarda, sayfaların alt bölümlerinde ve sayfadaki belirli bir işleme isteği olan herhangi bir öğe için eşit derecede iyi çalışır.

Dolayısıyla, 404 bu senaryoda kullanılacak doğru koddur. Bunun , bir isteğin yayınlandığı ancak hiç yanıtlanmadığı, yanıtlanmanın aksine ancak istenen kaynak olmadığı farklı bir durum olan 'sunucu bulunamadı' için geçerli olmadığını unutmayın.


1
Foo nesnesini id = 1 ile güncellemek istersem ve veritabanında bu id ile foo yoksa ne olur?
valijon

1
Bu senaryoda, düzeltmeniz gereken bir eşzamanlılık sorununuz var: id = 1 olan bir nesneyi aldıysanız ve onu güncellemeye çalıştığınızda artık mevcut değilse, başka bir iş parçacığı veya işlem kilidinizi yok saydı (veya siz bir tane ayarlamadıysanız) ve sildi. Bu iyi değil. Alternatif olarak, id = n nesnesini (burada n size sağlanır) varlığını kontrol etmeden güncellemeye çalışıyorsanız, güncelleme mantığınızda bir doğrulama adımını kaçırıyorsunuz ve bu da iyi değil.
Eight-Bit Guru


8

Bu, userid'in bir kaynak tanımlayıcı mı yoksa ek parametre mi olduğuna bağlıdır. Eğer öyleyse, 404 döndürmek sorun değil, eğer değilse, gibi başka bir kod döndürebilirsin

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

Ücretsiz InfoQ Explores: REST kitabında daha fazla bilgi .


1
"Ek parametre" derken, başlık alanı isteğini mi kastediyorsunuz? Aksi takdirde 412 kullanılmasını tavsiye etmem. "412 (Ön Koşul Başarısız) durum kodu, sunucuda test edildiğinde istek başlığı alanlarında verilen bir veya daha fazla koşulun yanlış olarak değerlendirildiğini gösterir."
oferei

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.