Dalam artikel wiki untuk REST ditunjukkan bahwa jika Anda menggunakan http://example.com/resources DELETE, itu berarti Anda menghapus seluruh koleksi.
Jika Anda menggunakan http://example.com/resources/7HOU57Y DELETE, artinya Anda menghapus elemen tersebut.
Saya membuat SITUS WEB, catat BUKAN LAYANAN WEB.
Saya memiliki daftar yang memiliki 1 kotak centang untuk setiap item di daftar. Setelah saya memilih beberapa item untuk dihapus, saya akan mengizinkan pengguna untuk menekan tombol bernama DELETE SELECTION. Jika pengguna menekan tombol, kotak dialog js akan muncul meminta pengguna untuk mengkonfirmasi penghapusan. jika pengguna mengkonfirmasi, semua item akan dihapus.
Jadi, bagaimana saya harus melayani penghapusan beberapa item dengan cara yang RESTFUL?
CATATAN, saat ini untuk DELETE di halaman web, yang saya lakukan adalah menggunakan tag FORM dengan POST sebagai tindakan tetapi menyertakan _method dengan nilai DELETE karena ini adalah apa yang ditunjukkan oleh orang lain di SO tentang cara melakukan penghapusan RESTful untuk halaman web .
Jawaban:
Saya pikir jawaban rojoca sejauh ini adalah yang terbaik. Sedikit variasi mungkin, untuk menghilangkan konfirmasi javascript pada halaman yang sama, dan sebaliknya, membuat pilihan dan mengarahkan ulang ke sana, menunjukkan pesan konfirmasi pada halaman itu. Dengan kata lain:
Dari:
http://example.com/resources/
lakukan a
POSTING dengan ID pilihan untuk:
http://example.com/resources/selections
yang, jika berhasil, harus merespons dengan:
HTTP / 1.1 201 dibuat, dan tajuk Lokasi ke:
http://example.com/resources/selections/DF4XY7
Pada halaman ini Anda akan melihat kotak konfirmasi (javascript), yang jika Anda konfirmasi akan melakukan permintaan:
HAPUS http://example.com/resources/selections/DF4XY7
yang, jika berhasil, harus merespons dengan: HTTP / 1.1 200 Ok (atau apa pun yang sesuai untuk penghapusan yang berhasil)
sumber
http://example.com/resources/selections/
dan dalam payload (isi) permintaan Anda mengirim data untuk item mana yang ingin Anda hapus. Sejauh yang saya tahu, tidak ada yang mencegah Anda melakukan ini, tetapi saya selalu bertemu dengan "tetapi itu tidak RESTfull".Salah satu opsinya adalah membuat "transaksi" hapus. Jadi Anda
POST
sepertihttp://example.com/resources/deletes
sumber daya baru yang terdiri dari daftar sumber daya yang akan dihapus. Kemudian di aplikasi Anda, Anda tinggal melakukan delete. Ketika Anda melakukan posting, Anda harus mengembalikan lokasi transaksi yang Anda buat, misalnyahttp://example.com/resources/deletes/DF4XY7
. AGET
ini dapat mengembalikan status transaksi (selesai atau dalam proses) dan / atau daftar sumber daya yang akan dihapus.sumber
Inilah yang dilakukan Amazon dengan S3 REST API mereka.
Permintaan penghapusan individu:
Permintaan Hapus Multi-Objek :
Tetapi Facebook Graph API , Parse Server REST API, dan Google Drive REST API melangkah lebih jauh dengan memungkinkan Anda untuk "menumpuk" operasi individual dalam satu permintaan.
Berikut contoh dari Parse Server.
Permintaan penghapusan individu:
Permintaan batch:
sumber
Saya akan mengatakan HAPUS http://example.com/resources/id1,id2,id3,id4 atau HAPUS http://example.com/resources/id1+id2+id3+id4 . Karena "REST adalah arsitektur (...) [bukan] protokol" untuk mengutip artikel wikipedia ini, saya yakin, tidak ada satu cara pun untuk melakukan ini.
Saya sadar bahwa di atas tidak mungkin tanpa JS dengan HTML tetapi saya merasa REST adalah:
sumber
Menariknya, saya pikir metode yang sama berlaku untuk PATCHing beberapa entitas, dan memerlukan pemikiran tentang apa yang kami maksud dengan URL, parameter, dan metode REST kami.
kembalikan semua elemen 'foo':
[GET] api/foo
kembalikan elemen 'foo' dengan pemfilteran untuk id tertentu:
[GET] api/foo?ids=3,5,9
Dimana artinya adalah URL dan filter menentukan "elemen apa yang kita hadapi?", Dan metode REST (dalam hal ini "GET") mengatakan "apa yang harus dilakukan dengan elemen tersebut?"
Oleh karena itu PATCH beberapa record untuk menandainya sebagai telah dibaca
[PATCH] api/foo?ids=3,5,9
..dengan data foo [read] = 1
Terakhir untuk menghapus beberapa rekaman, titik akhir ini paling logis:
[DELETE] api/foo?ids=3,5,9
Tolong mengerti, saya tidak percaya ada "aturan" tentang ini - bagi saya itu "masuk akal"
sumber
Seperti yang dikatakan jawaban Decent Dabbler dan jawaban rojocas , yang paling kanonik adalah menggunakan sumber daya virtual untuk menghapus pilihan sumber daya, tetapi menurut saya itu salah dari perspektif REST, karena menjalankan a
DELETE http://example.com/resources/selections/DF4XY7
harus menghapus sumber daya pilihan itu sendiri, bukan sumber daya yang dipilih.Mengambil anwser Maciej Piechotka atau jawaban fezfox , saya hanya memiliki keberatan: Ada cara yang lebih kanonik untuk melewatkan array id, dan menggunakan operator array:
DELETE /api/resources?ids[]=1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d&ids[]=7e8f9a0b-1c2d-3e4f-5a6b-7c8d9e0f1a2b
Dengan cara ini Anda menyerang ke titik akhir Koleksi Hapus tetapi memfilter penghapusan dengan string kueri dengan cara yang benar.
sumber
Karena tidak ada cara yang 'tepat' untuk melakukan ini, apa yang telah saya lakukan di masa lalu adalah:
kirim HAPUS ke http://example.com/something dengan data yang dikodekan xml atau json di bagian isi.
ketika Anda menerima permintaan, periksa HAPUS, jika benar, kemudian baca isi untuk yang akan dihapus.
sumber
A payload within a DELETE request message has no defined semantics; sending a payload body on a DELETE request might cause some existing implementations to reject the request.
dari tools.ietf.org/html/rfc7231#section-4.3.5Saya memiliki situasi yang sama untuk menghapus beberapa item. Inilah yang akhirnya saya lakukan. Saya menggunakan operasi DELETE dan id item yang akan dihapus adalah bagian dari header HTTP.
sumber