Jadi, mengingat kata kerja DELETE di Http idempoten, ketika saya mengeluarkan permintaan berikut, apa yang harus terjadi pada permintaan kedua (atau ketiga, atau keempat, dll ...)?
DELETE /person/123
Pertama kali, sumber daya dihapus dan saya mengembalikan 204 (berhasil, tidak ada konten). Haruskah saya mengembalikan 204 pada panggilan berikutnya atau 404 (tidak ditemukan)?
sumber
rm
.rm
mengembalikan kesalahan jika tidak ada. tools.ietf.org/html/rfc7231#section-4.3.5Buku masak layanan web RESTful adalah sumber yang bagus untuk ini. Secara kebetulan, pratinjau google-nya menampilkan halaman tentang HAPUS (halaman 11):
sumber
Saya setuju dengan jawaban yang dipilih saat ini, bahwa DELETE ke-2 (dan ke-3, ke-4, ...) harus mendapatkan 404 . Dan, saya perhatikan bahwa jawaban tersebut mendapat 143 suara positif tetapi juga memiliki komentar sebaliknya yang mendapat 54 suara, jadi komunitas ini dibagi menjadi 2 kubu dengan rasio sekitar 3: 1. Inilah lebih banyak informasi untuk menyelesaikan perdebatan lama ini.
Pertama-tama, JANGAN mulai dengan apa yang "saya" pikirkan, apa yang "Anda" pikirkan, atau apa yang dipikirkan oleh penulis buku lain. Mari kita mulai dengan spesifikasi HTTP yaitu RFC 7231.
DELETE /some/resource/which/does/not/exist
akan menghasilkan 404. Kemudian,DELETE /some/resource/which/happened/to/be/removed/by/someone/else/five/days/ago
mungkin juga mengembalikan 404 Lalu, kenapa harusDELETE /some/resource/i/deleted/five/seconds/ago
berbeda? "Tapi bagaimana dengan idempotensi ?!", saya bisa mendengar Anda berteriak seperti itu. Tunggu, kami akan membahasnya.Secara historis, RFC 2616, yang diterbitkan pada tahun 1999, adalah spesifikasi HTTP 1.1 yang paling banyak dirujuk. Sayangnya penjelasannya tentang idempotensi tidak jelas , yang menyisakan ruang untuk semua perdebatan ini. Tapi spesifikasi itu telah digantikan oleh RFC 7231. Dikutip dari RFC 7231, bagian 4.2.2 Metode Idempoten , tekankan saya:
Jadi, tertulis dalam spesifikasi, idempotensi adalah tentang efek pada server. DELETE pertama mengembalikan 204 dan kemudian DELETE berikutnya mengembalikan 404, kode status berbeda seperti itu TIDAK membuat DELETE menjadi non-idempoten. Menggunakan argumen ini untuk membenarkan pengembalian 204 berikutnya, sama sekali tidak relevan.
Oke jadi ini bukan tentang idempotensi. Tapi kemudian pertanyaan lanjutannya mungkin, bagaimana jika kita masih memilih untuk menggunakan 204 dalam DELETE berikutnya? Apakah ini oke?
Pertanyaan bagus. Motivasinya dapat dimengerti: untuk memungkinkan klien tetap mencapai hasil yang diinginkan, tanpa mengkhawatirkan penanganan kesalahan. Saya akan mengatakan, mengembalikan 204 dalam DELETE berikutnya, adalah "kebohongan putih" sisi server yang sebagian besar tidak berbahaya, yang sisi klien tidak akan segera membedakannya. Itulah mengapa ada ~ 25% orang melakukan itu di alam liar dan tampaknya masih berhasil. Ingatlah bahwa, kebohongan semacam itu dapat dianggap aneh secara semantik, karena
GET /non-exist
mengembalikan 404 tetapiDELETE /non-exist
memberikan 204, pada saat itu klien akan mengetahui bahwa layanan Anda tidak sepenuhnya sesuai dengan bagian 6.5.4 404 Not Found .Namun saya ingin menunjukkan bahwa, cara yang dimaksudkan yang ditunjukkan oleh RFC 7231, yaitu mengembalikan 404 pada DELETE berikutnya, seharusnya tidak menjadi masalah sejak awal. 3x lebih banyak pengembang memilih untuk melakukan itu, dan apakah Anda pernah mendengar insiden besar atau keluhan yang disebabkan oleh klien yang tidak dapat menangani 404? Agaknya, tidak, dan itu karena, klien yang layak yang mengimplementasikan HTTP DELETE (atau metode HTTP apa pun, dalam hal ini), tidak akan secara membabi buta berasumsi bahwa hasilnya akan selalu berhasil 2xx. Dan kemudian, setelah pengembang mulai mempertimbangkan penanganan kesalahan, 404 Not Found akan menjadi salah satu kesalahan pertama yang terlintas dalam pikiran. Pada titik itu, dia mungkin akan menarik kesimpulan bahwa, secara semantik aman untuk operasi HTTP DELETE mengabaikan kesalahan 404. Dan mereka melakukannya.
Masalah terpecahkan.
sumber
HAPUS Pertama : 200 atau 204.
HAPUS berikutnya : 200 atau 204.
Rasional : DELETE harus idempoten. Jika Anda mengembalikan 404 pada HAPUS kedua, tanggapan Anda berubah dari kode sukses menjadi kode kesalahan . Program klien mungkin mengambil tindakan yang salah berdasarkan asumsi DELETE gagal.
Contoh :
Hanya untuk mengilustrasikan penggunaan pendekatan ini, panduan gaya API HTTP untuk PayPal memiliki panduan berikut:
sumber