Apa kode status respons yang tepat untuk POST ketika sumber daya induk tidak ditemukan?

10

Saya memiliki titik akhir berikut:

a/{id}/b

dan ingin membuat bdengan mengirim POSTpermintaan padanya. Jika adengan diberikan {id}tidak ditemukan haruskah saya merespons 404 NOT_FOUNDatau mungkin dengan 409 CONFLICT?

Ini untuk menangani secara sederhana a/{id}, masalahnya adalah bahwa di sini sumber daya digunakan.

Opal
sumber
Kemungkinan duplikat dari Bagaimana menangani aturan bisnis dengan API REST?
nyamuk

Jawaban:

15

404 NOT FOUNDtampaknya respons yang sesuai, karena sumber daya dengan ID ini tidak ada. Sangat jelas untuk dipahami dan Anda mengharapkan respons yang sama jika a/{id}dipanggil.

409 CONFLICTmenurut saya bukan pilihan yang lebih baik, karena dalam contoh Anda, Anda akan mengembalikan 409 ketika sumber daya induk tidak ditemukan :).

Tetapi ingat bahwa hal yang paling penting adalah konsisten dalam API Anda

Dherik
sumber
Saya setuju. Jika Anda mencoba menulis ke folder yang tidak ada, apakah itu konflik atau kesalahan folder yang hilang? Sepertinya lebih intuitif bagi saya.
Neil
"Folder" yang Anda maksud jalur yang tidak ada?
Dherik
Maksud saya folder, seperti pada sistem file.
Neil
Bisakah Anda merinci skenario? Karena itu tergantung. Jika folder itu diharapkan untuk server dan (untuk alasan apa pun) tidak ada saya pikir ini adalah kesalahan server (5xx) bukan kesalahan klien (4xx). Jika nilai folder ini diteruskan oleh klien ke sumber daya (seperti id), adalah 404. Tetapi jika folder itu diteruskan dalam tubuh ini bisa menjadi hal lain (412, 422 ... sesuatu untuk mewakili "validasi gagal: folder tidak tidak ada"). Ini pertanyaan yang bagus untuk ditanyakan dan didiskusikan.
Dherik
Jika Anda meminta file server dengan path /nonexistent/help.html, dan folder / nonexistent tidak ada, hanya ada satu respons yang jelas untuk ini. 404 file tidak ditemukan! Bahkan ada /home/help.html, dan responsnya tidak akan berbeda. Ini adalah aplikasi REST dengan jelas, tetapi saya tidak melihat alasan mengapa logika akan berubah. Orang tua harus ada terlebih dahulu.
Neil
4

Selain jawaban @ Dherik.

URI adalah pengidentifikasi , jadi kita harus ingat bahwa ( /a/{id}/badalah pengidentifikasi). The URI ada artinya untuk WWW, dan begitu juga untuk klien HTTP.

404 adalah jawaban yang tepat . Intinya, server menjawab

Saya tidak menemukan sumber daya dengan id seperti itu. Sumber daya tidak ditemukan 1

Apakah sumber daya yang hilang adalah orang tua atau anak tidak masalah.

Kami, pengembang, melihat hierarki dan jalur di URI, tetapi klien HTTP tidak. Dengan kata lain, HTTP hanya dimaksudkan untuk ditafsirkan oleh klien HTTP tetapi tidak oleh manusia (devs, pengguna akhir, dll).

Jika ragu, jangan tanya kode apa yang masuk akal untuk Anda (manusia). Tanyakan, kode apa yang masuk akal untuk klien HTTP. Bagaimana Anda ingin klien HTTP berperilaku?

Mengapa? Karena beberapa kode status menyebabkan klien ini melakukan operasi tertentu. Misalnya, 302 . Kode ini biasanya membuat browser web untuk mengarahkan ulang ke lokasi tertentu (URI) yang diinformasikan dalam header respons.

Ini mungkin bukan kasus Anda, tetapi penting untuk diperhatikan. Pada akhirnya, kode status HTTP ditujukan ke klien HTTP. Tidak untuk aplikasi kita. Bukan untuk orang.


1: 409 jarang diimplementasikan sebagai kesalahan navigasi. Biasanya melibatkan pelaksanaan operasi jarak jauh (hapus, perbarui, baru, dll). Tetapi URI harus ada. Kalau tidak, 404 akan menang

Laiv
sumber