Apa kode status HTTP yang paling tepat untuk halaman kesalahan "item tidak ditemukan"

117

Saya ingin tahu kode status HTTP apa yang paling sesuai untuk halaman "item tidak ada".

Jika halaman itu sendiri tidak ada, saya jelas akan menggunakan 404. Namun, salah satu halaman saya memiliki userid argumen (ini adalah halaman "edit pengguna") dan jika tidak ada pengguna dengan ID pengguna yang diberikan, saya menampilkan halaman kesalahan, tetapi saya juga ingin mengirim tajuk status 4xx (karena "200 OK" tidak terlalu pas).

Saya kira 404 akan baik-baik saja karena itu "tidak ditemukan" dan bukan "file tidak ditemukan", tapi saya ingin tahu apakah ada kode yang lebih baik untuk kasus ini.

ThiefMaster
sumber

Jawaban:

139

Menjadi terlalu pintar dengan kode kesalahan HTTP yang tidak jelas adalah ide yang buruk. Peramban terkadang bereaksi dengan cara yang tidak membantu yang mengaburkan situasi. Tetap dengan 404.

bmargulies
sumber
14
Sialan Anda karena memberikan nasihat yang baik :( OCD untuk tidak 404 semua hal itu nyata.
Carrie Kendall
16
Kesalahan 404 agak ambigu untuk membedakan URI yang buruk versus entitas yang tidak ditemukan. Kode standar baru diperlukan untuk membedakan 404.
Breakskater
2
Saya lebih suka mengembalikan 204 konten kosong daripada mengembalikan kode status
ambigus
46

Kode pengembalian 404 sebenarnya berarti 'sumber daya tidak ditemukan', dan berlaku untuk entitas apa pun yang permintaannya dibuat tetapi tidak dipenuhi. Jadi, ia bekerja sama baiknya untuk halaman, subbagian halaman, dan item apa pun yang ada di halaman yang memiliki permintaan khusus untuk dirender.

Jadi 404 adalah kode yang tepat untuk digunakan dalam skenario ini. Perhatikan bahwa ini tidak berlaku untuk 'server tidak ditemukan', yang merupakan situasi berbeda di mana permintaan dikeluarkan tetapi tidak dijawab sama sekali, berlawanan dengan dijawab tetapi tanpa sumber daya yang diminta.

Guru Delapan-Bit
sumber
1
Bagaimana jika saya ingin memperbarui objek foo dengan id = 1 dan tidak ada foo di database dengan id ini?
valijon
1
Dalam skenario ini, Anda memiliki masalah konkurensi untuk diperbaiki: jika Anda mengambil sebuah objek dengan id = 1 dan itu tidak ada lagi saat Anda mencoba untuk memperbaruinya, beberapa utas atau proses lain mengabaikan kunci Anda (atau Anda tidak menyetelnya) dan menghapusnya. Itu tidak baik. Atau, jika Anda mencoba memperbarui objek id = n (di mana n disediakan untuk Anda) tanpa terlebih dahulu memeriksa keberadaannya, Anda kehilangan langkah validasi dalam logika pembaruan Anda, yang juga tidak baik.
Eight-Bit Guru
8

Itu tergantung apakah userid adalah pengenal sumber daya atau parameter tambahan. Jika ya, maka tidak masalah untuk mengembalikan 404 jika tidak, Anda dapat mengembalikan kode lain seperti

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

Info lebih lanjut di InfoQ Explores gratis : buku REST .

cetnar
sumber
1
Yang Anda maksud dengan "parameter tambahan" adalah bidang tajuk permintaan? Jika tidak, saya tidak akan merekomendasikan penggunaan 412. "Kode status 412 (Prekondisi Gagal) menunjukkan bahwa satu atau lebih kondisi yang diberikan dalam bidang tajuk permintaan dievaluasi sebagai salah saat diuji di server."
oferei