Apakah ada sesuatu yang non-TENANG tentang memberikan parameter ke permintaan HTTP DELETE?
Skenario saya adalah saya memodelkan "Anda yakin ingin menghapusnya?" skenario. Dalam beberapa kasus, keadaan sumber daya menunjukkan bahwa penghapusan yang diminta mungkin tidak valid. Anda mungkin dapat membayangkan sendiri beberapa skenario di mana konfirmasi penghapusan diperlukan
Solusi yang kami adopsi adalah meneruskan parameter ke permintaan hapus untuk menunjukkan bahwa tidak apa-apa untuk melanjutkan penghapusan ("? Force_delete = true")
misalnya
DELETE http://server/resource/id?force_delete=true
Saya percaya bahwa itu masih tenang sejak:
(a) Semantik DELETE tidak sedang diubah - pengguna masih dapat mengirim permintaan DELETE normal tetapi ini mungkin gagal dengan 409 dan badan tanggapan akan menjelaskan alasannya. Saya katakan mungkin gagal karena (karena alasan tidak layak dijelaskan) pada beberapa kesempatan tidak ada alasan untuk meminta pengguna.
(B) Tidak ada dalam disertasi Roy untuk menyarankan bahwa itu bertentangan dengan semangat REST - mengapa akan ada karena HTTP hanya satu implementasi dari REST jadi mengapa melewati parameter HTTP penting
Dapatkah seseorang mengarahkan saya pada pernyataan definitif yang mendukung alasan mengapa ini tidak tenang?
Pada pertanyaan terkait, jika pengguna tidak menentukan force_delete maka saya kembali 409 Conflict
- apakah itu kode respons yang paling tepat?
Mengikuti
Setelah beberapa penelitian lebih lanjut, saya berpikir bahwa menambahkan parameter ke DELETE dapat melanggar beberapa prinsip.
Yang pertama adalah bahwa implementasi mungkin melanggar "Uniform Interface" (lihat bagian 5.1.5 disertasi Roy
Dengan menambahkan 'force_delete' kami menambahkan kendala tambahan ke metode DELETE yang sudah didefinisikan dengan baik. Batasan ini hanya berarti bagi kita.
Anda juga bisa berpendapat bahwa itu melanggar "5.1.2 Client-Server" karena dialog konfirmasi benar-benar menjadi perhatian UI dan sekali lagi tidak semua klien ingin mengonfirmasi penghapusan.
Saran siapa pun?
Jawaban:
Tidak, itu tidak tenang. Satu-satunya alasan mengapa Anda harus meletakkan kata kerja (
force_delete
) ke dalam URI adalah jika Anda perlu membebani metode GET / POST di lingkungan di mana metode PUT / DELETE tidak tersedia. Menilai dari penggunaan Anda terhadap metode DELETE, ini bukan masalahnya.Kode kesalahan HTTP
409/Conflict
harus digunakan untuk situasi di mana ada konflik yang mencegah layanan RESTful untuk melakukan operasi, tetapi masih ada kemungkinan bahwa pengguna mungkin dapat menyelesaikan konflik itu sendiri. Konfirmasi pra-penghapusan (di mana tidak ada konflik nyata yang akan mencegah penghapusan) bukanlah konflik semata, karena tidak ada yang menghalangi API untuk melakukan operasi yang diminta.Seperti yang dikatakan Alex (saya tidak tahu siapa yang menurunkannya, dia benar), ini harus ditangani di UI, karena layanan RESTful hanya memproses permintaan dan karena itu harus stateless (yaitu tidak boleh bergantung pada konfirmasi dengan memegang informasi sisi server tentang permintaan).
Dua contoh cara melakukan ini di UI adalah:
(*) Harap perhatikan bahwa versi HTML sebelum 5 tidak mendukung metode PUT dan HAPUS secara native, namun sebagian besar browser modern dapat melakukan kedua metode ini melalui panggilan AJAX. Lihat utas ini untuk detail tentang dukungan lintas-browser.
Memperbarui (berdasarkan investigasi dan diskusi tambahan):
Skenario di mana layanan akan memerlukan
force_delete=true
bendera untuk hadir melanggar antarmuka seragam seperti yang didefinisikan dalam disertasi Roy Fielding. Juga, sesuai HTTP RFC , metode DELETE dapat ditimpa pada server asal (klien), menyiratkan bahwa ini tidak dilakukan pada server target (layanan).Jadi, begitu layanan menerima permintaan DELETE, ia harus memprosesnya tanpa memerlukan konfirmasi tambahan (terlepas apakah layanan tersebut benar-benar melakukan operasi).
sumber
force_delete=true
? Sesuai HTTP RFC, metode DELETE dapat ditimpa pada server asal (klien), menyiratkan bahwa ini tidak dilakukan pada server target (layanan). Jadi pemahaman saya adalah bahwa begitu layanan menerima permintaan DELETE, harus memprosesnya tanpa memerlukan konfirmasi (terlepas apakah layanan tersebut benar-benar melakukan operasi).Saya pikir ini tidak tenang. Saya tidak berpikir layanan yang tenang harus menangani persyaratan memaksa pengguna untuk mengonfirmasi penghapusan. Saya akan menangani ini di UI.
Apakah menentukan force_delete = true masuk akal jika ini adalah API program? Jika seseorang menulis skrip untuk menghapus sumber ini, apakah Anda ingin memaksa mereka untuk menentukan force_delete = true untuk benar-benar menghapus sumber daya?
sumber
Ini pertanyaan lama, tapi di sini ada beberapa komentar ...
sumber
Selain jawaban Alex:
Perhatikan bahwa http: // server / resource / id? Force_delete = true mengidentifikasi sumber yang berbeda dari http: // server / resource / id . Misalnya, ada perbedaan besar apakah Anda menghapus / customers /? Status = lama atau / pelanggan /.
Jan
sumber