Saya sedang membangun API REST, tetapi saya mengalami masalah.
Tampaknya praktik yang diterima dalam merancang API REST adalah bahwa jika sumber daya yang diminta tidak ada, 404 dikembalikan.
Namun, bagi saya, ini menambah ambiguitas yang tidak perlu. HTTP 404 lebih tradisional dikaitkan dengan URI yang buruk. Jadi sebenarnya kami mengatakan, "Anda berada di tempat yang tepat, tetapi catatan spesifik itu tidak ada, atau tidak ada lokasi seperti itu di Internet! Saya benar-benar tidak yakin yang mana ..."
Pertimbangkan URI berikut:
http://mywebsite/api/user/13
Jika saya mendapatkan kembali 404, apakah itu karena Pengguna 13 tidak ada? Atau karena URL saya seharusnya :
http://mywebsite/restapi/user/13
Di masa lalu, saya baru saja mengembalikan hasil NULL dengan HTTP 200 OK
kode respons jika catatan tidak ada. Ini sederhana, dan menurut saya sangat bersih, bahkan jika itu belum tentu diterima. Tetapi apakah ada cara yang lebih baik untuk melakukan ini?
sumber
Jawaban:
404 hanyalah kode respons HTTP. Selain itu, Anda dapat memberikan badan tanggapan dan / atau header lainnya dengan pesan kesalahan yang lebih bermakna yang akan dilihat oleh pengembang.
sumber
Gunakan
404
jika sumber daya tidak ada. Jangan kembali200
dengan tubuh kosong.Ini mirip dengan
undefined
string kosong (misalnya""
) dalam pemrograman. Meskipun sangat mirip, pasti ada perbedaan.404
berarti tidak ada yang ada pada URI itu (seperti variabel yang tidak didefinisikan dalam pemrograman). Kembali200
dengan tubuh kosong berarti ada sesuatu yang ada di sana dan ada sesuatu yang kosong sekarang (seperti string kosong dalam pemrograman).404
tidak berarti itu adalah "URI buruk". Ada kode HTTP khusus yang dimaksudkan untuk kesalahan URI (misalnya414 Request-URI Too Long
).sumber
String getName()
yang memiliki implementasi seperti ini:return this.name == null ? "" : this.name
. Itu tidak benar kecuali jika Anda ingin klien untuk mengetahui bahwathis.name
adalahnull
.Seperti kebanyakan hal, "itu tergantung". Tapi bagiku, latihan tidak buruk dan tidak akan melawan HTTP spec per se . Namun, mari kita jelaskan beberapa hal.
Pertama, URI harus buram. Bahkan jika mereka tidak buram pada orang, mereka tidak jelas pada mesin. Dengan kata lain, perbedaan antara
http://mywebsite/api/user/13
,http://mywebsite/restapi/user/13
sama dengan perbedaan antarahttp://mywebsite/api/user/13
danhttp://mywebsite/api/user/14
yaitu tidak sama bukan periode yang sama. Jadi 404 akan sepenuhnya sesuai untukhttp://mywebsite/api/user/14
(jika tidak ada pengguna seperti itu) tetapi tidak harus satu-satunya respons yang tepat.Anda juga dapat mengembalikan 200 tanggapan kosong atau lebih eksplisit respons 204 (Tidak Ada Konten). Ini akan menyampaikan sesuatu yang lain kepada klien. Ini akan menyiratkan bahwa sumber daya yang diidentifikasi oleh
http://mywebsite/api/user/14
tidak memiliki konten atau pada dasarnya tidak ada. Ini artinya bahwa ada adalah sumber daya seperti itu. Namun, itu tidak selalu berarti bahwa Anda mengklaim ada beberapa pengguna yang bertahan di penyimpanan data dengan id 14. Itu urusan pribadi Anda, bukan urusan klien yang mengajukan permintaan. Jadi, jika masuk akal untuk memodelkan sumber daya Anda seperti itu, silakan.Ada beberapa implikasi keamanan untuk memberikan informasi kepada klien Anda yang akan membuatnya lebih mudah bagi mereka untuk menebak URI yang sah. Mengembalikan 200 pada kesalahan alih-alih 404 dapat memberi klien petunjuk bahwa setidaknya
http://mywebsite/api/user
bagian itu benar. Klien jahat bisa terus mencoba bilangan bulat yang berbeda. Tetapi bagi saya, klien jahat tetap bisa menebakhttp://mywebsite/api/user
bagian itu. Obat yang lebih baik adalah dengan menggunakan UUID. yaituhttp://mywebsite/api/user/3dd5b770-79ea-11e1-b0c4-0800200c9a66
lebih baik daripadahttp://mywebsite/api/user/14
. Melakukan itu, Anda bisa menggunakan teknik mengembalikan 200 tanpa memberikan banyak.sumber
404 Tidak Ditemukan secara teknis berarti uri saat ini tidak memetakan ke sumber daya. Dalam contoh Anda, saya menafsirkan permintaan
http://mywebsite/api/user/13
yang mengembalikan a 404 yang menyiratkan bahwa url ini tidak pernah dipetakan ke sumber daya. Kepada klien, itu harus menjadi akhir dari percakapan.Untuk mengatasi masalah ambiguitas, Anda dapat meningkatkan API Anda dengan memberikan kode respons lain. Misalnya, jika Anda ingin mengizinkan klien mengeluarkan GET permintaan url
http://mywebsite/api/user/13
, Anda ingin berkomunikasi bahwa klien harus menggunakan url kanonikhttp://mywebsite/restapi/user/13
. Dalam hal ini, Anda mungkin ingin mempertimbangkan mengeluarkan pengalihan permanen dengan mengembalikan 301 Moved Permanently dan memasok url kanonik di header Lokasi respons. Ini memberi tahu klien bahwa untuk permintaan di masa mendatang mereka harus menggunakan url kanonik.sumber
Jadi intinya, sepertinya jawabannya bisa bergantung pada bagaimana permintaan itu terbentuk.
Jika sumber daya yang diminta merupakan bagian dari URI sesuai permintaan
http://mywebsite/restapi/user/13
dan pengguna 13 tidak ada, maka 404 mungkin sesuai dan intuitif karena URI mewakili pengguna / entitas / dokumen / dll yang tidak ada. Hal yang sama berlaku untuk teknik yang lebih aman menggunakan GUIDhttp://mywebsite/api/user/3dd5b770-79ea-11e1-b0c4-0800200c9a66
dan argumen api / restapi di atas.Namun, jika ID sumber daya yang diminta dimasukkan dalam tajuk permintaan [sertakan contoh Anda sendiri], atau memang, dalam URI sebagai parameter, mis.
http://mywebsite/restapi/user/?UID=13
Maka URI akan tetap benar (karena konsep PENGGUNA tidak ada padahttp://mywebsite/restapi/user/
); dan oleh karena itu responsnya bisa masuk akal diharapkan menjadi 200 (dengan pesan yang tepat verbose) karena pengguna spesifik yang dikenal sebagai 13 tidak ada tetapi URI tidak. Dengan cara ini kami mengatakan URI baik, tetapi permintaan untuk data tidak memiliki konten.Secara pribadi 200 masih terasa tidak benar (meskipun saya sebelumnya berpendapat itu benar). 200 kode respons (tanpa respons verbal) dapat menyebabkan masalah untuk tidak diselidiki ketika ID yang salah dikirim misalnya.
Pendekatan yang lebih baik adalah mengirim
204 - No Content
tanggapan. Ini sesuai dengan deskripsi w3c * Server telah memenuhi permintaan tetapi tidak perlu mengembalikan entitas-badan, dan mungkin ingin mengembalikan metainformation yang diperbarui. * 1 Kebingungan, menurut saya disebabkan oleh entri Wikipedia yang menyatakan 204 Tidak Ada Konten - Server berhasil memproses permintaan, tetapi tidak mengembalikan konten apa pun. Biasanya digunakan sebagai respons terhadap permintaan penghapusan yang berhasil .Kalimat terakhir sangat bisa diperdebatkan. Pertimbangkan situasi tanpa kalimat itu dan solusinya mudah - cukup kirim 204 jika entitas tidak ada. Bahkan ada argumen untuk mengembalikan 204 bukannya 404, permintaan telah diproses dan tidak ada konten yang dikembalikan! Perlu diketahui juga, 204's tidak memperbolehkan konten di badan responsSumber
http://en.wikipedia.org/wiki/List_of_HTTP_status_codes 1. http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
sumber
Itu adalah posting yang sangat lama tetapi saya menghadapi masalah yang sama dan saya ingin berbagi pengalaman saya dengan kalian.
Saya sedang membangun arsitektur microservice dengan API lainnya. Saya punya beberapa layanan GET istirahat, mereka mengumpulkan data dari sistem back-end berdasarkan parameter permintaan.
Saya mengikuti dokumen desain API lainnya dan saya mengirim kembali HTTP 404 dengan pesan kesalahan JSON yang sempurna ke klien ketika tidak ada data yang selaras dengan kondisi kueri (misalnya, nol catatan dipilih).
Ketika tidak ada data untuk dikirim kembali ke klien saya menyiapkan pesan JSON sempurna dengan kode kesalahan internal, dll. Untuk menginformasikan klien tentang alasan "Tidak Ditemukan" dan itu dikirim kembali ke klien dengan HTTP 404. Itu bekerja dengan baik.
Kemudian saya telah membuat kelas klien API sisanya yang merupakan bantuan mudah untuk menyembunyikan kode terkait komunikasi HTTP dan saya menggunakan bantuan ini setiap saat ketika saya memanggil API sisanya dari kode saya.
TETAPI saya perlu menulis kode tambahan yang membingungkan hanya karena HTTP 404 memiliki dua fungsi berbeda:
Penting: Penangan kesalahan API istirahat saya menangkap semua pengecualian yang muncul di layanan back-end yang berarti jika terjadi kesalahan, API sisanya selalu kembali dengan pesan JSON sempurna dengan detail pesan.
Ini adalah versi pertama dari metode pembantu klien saya yang menangani dua respons HTTP 404 yang berbeda:
TAPI , karena klien Java atau JavaScript saya dapat menerima dua jenis HTTP 404, entah bagaimana, saya perlu memeriksa isi respons jika ada HTTP 404. Jika saya dapat menguraikan respons, maka saya yakin saya mendapatkan kembali respons di mana ada tidak ada data untuk dikirim kembali ke klien.
Jika saya tidak dapat menguraikan respons itu berarti saya mendapatkan kembali HTTP 404 nyata dari server web (bukan dari aplikasi API lainnya).
Sangat membingungkan dan aplikasi klien selalu perlu melakukan parsing ekstra untuk memeriksa alasan sebenarnya dari HTTP 404.
Jujur saya tidak suka solusi ini. Ini membingungkan, perlu menambahkan kode omong kosong tambahan ke klien sepanjang waktu.
Jadi alih-alih menggunakan HTTP 404 dalam dua skenario berbeda ini, saya memutuskan untuk melakukan hal berikut:
Dalam hal ini kode klien bisa lebih elegan:
Saya pikir ini menangani masalah itu dengan lebih baik.
Jika Anda memiliki solusi yang lebih baik, silakan bagikan dengan kami.
sumber
Artikel tua tapi bagus ini ... http://www.infoq.com/articles/webber-rest-workflow mengatakan ini tentang hal itu ...
404 Tidak Ditemukan - Layanan ini terlalu malas (atau aman) untuk memberi kami alasan sebenarnya mengapa permintaan kami gagal, tetapi apa pun alasannya, kami harus menanganinya.
sumber
Uniform Resource Identifier adalah penunjuk unik ke sumber daya. Bentuk URI yang buruk tidak menunjuk ke sumber daya dan karenanya melakukan GET di atasnya tidak akan mengembalikan sumber daya. 404 berarti Server belum menemukan sesuatu yang cocok dengan Request-URI. Jika Anda memasukkan URI yang salah atau URI yang buruk itu adalah masalah Anda dan alasan Anda tidak mendapatkan sumber daya apakah halaman HTML atau IMG.
sumber
Untuk skenario ini, HTTP 404 adalah kode respons untuk respons dari REST API. Seperti 400, 401, 404, 422 entitas yang tidak dapat diproses
gunakan penanganan Exception untuk memeriksa pesan pengecualian penuh.
Blok pengecualian ini memberi Anda pesan yang tepat yang dilemparkan oleh REST API
sumber