Apa cara REST-ful untuk menghapus beberapa item?
Kasus penggunaan saya adalah saya memiliki Koleksi Tulang Belakang di mana saya harus dapat menghapus beberapa item sekaligus. Opsinya sepertinya:
- Kirim permintaan DELETE untuk setiap record (yang sepertinya ide buruk jika ada banyak item yang berpotensi);
- Kirim HAPUS di mana ID yang akan dihapus dirangkai di URL (yaitu, "/ records / 1; 2; 3");
- Dengan cara non-REST, kirim objek JSON khusus yang berisi ID yang ditandai untuk dihapus.
Semua opsi kurang dari ideal.
Ini tampak seperti area abu-abu dari konvensi REST.
api
rest
backbone.js
Donald Taylor
sumber
sumber
Jawaban:
/records/1;2;3
" - Jadi tanggapan 2xx untuk ini dapat menyebabkan mereka membersihkan cache mereka/records/1;2;3
; tidak membersihkan/records/1
,/records/2
atau/records/3
; proxy respons 410 untuk/records/1;2;3
, atau hal-hal lain yang tidak masuk akal dari sudut pandang Anda.records=[1,2,3]
to/delete-requests
) dan mengumpulkan sumber daya yang dibuat (ditentukan olehLocation
header respons) untuk mengetahui apakah permintaan Anda telah diterima, ditolak, sedang berlangsung atau telah selesai. Ini berguna untuk operasi yang berjalan lama. Cara lain adalah mengirimPATCH
permintaan ke sumber daya daftar ,/records
, yang isinya berisi daftar resource dan tindakan yang harus dilakukan pada resource tersebut (dalam format apa pun yang ingin Anda dukung). Ini berguna untuk operasi cepat di mana kode respons untuk permintaan dapat menunjukkan hasil operasi.Semuanya dapat dicapai dengan tetap berada dalam batasan REST, dan biasanya jawabannya adalah menjadikan "masalah" menjadi sumber daya, dan memberinya URL.
Jadi, operasi batch, seperti hapus di sini, atau POST beberapa item ke daftar, atau lakukan pengeditan yang sama ke sejumlah resource, semuanya dapat ditangani dengan membuat daftar "operasi batch" dan melakukan POST operasi baru Anda ke sana.
Jangan lupa, REST bukanlah satu-satunya cara untuk menyelesaikan masalah apa pun. "REST" hanyalah gaya arsitektur dan Anda tidak harus mematuhinya (tetapi Anda akan kehilangan manfaat tertentu dari internet jika tidak melakukannya). Saya sarankan Anda melihat daftar arsitektur HTTP API ini dan pilih yang cocok untuk Anda. Cukup buat diri Anda sadar akan kerugian yang Anda alami jika memilih arsitektur lain, dan buat keputusan yang tepat berdasarkan kasus penggunaan Anda.
Ada beberapa jawaban buruk untuk pertanyaan ini tentang Pola untuk menangani operasi batch di layanan web REST? yang memiliki terlalu banyak suara positif, tetapi harus dibaca juga.
sumber
DELETE
permintaan, apa pun yang ada di antara pemohon dan server akan menganggap satu sumber daya, di URL yang ditentukan, sedang dihapus. String kueri adalah bagian buram dari URL ke perangkat ini, jadi tidak peduli bagaimana Anda menentukan API Anda, mereka tidak mengetahui rahasia pengetahuan ini sehingga tidak dapat berperilaku berbeda.DELETE
permintaan dilarang. Jangan lakukan itu. Jika Anda melakukannya, saya akan memakan anak-anak Anda. Nyam nyam nyam.Jika
GET /records?filteringCriteria
mengembalikan array dari semua catatan yang cocok dengan kriteria, makaDELETE /records?filteringCriteria
bisa menghapus semua catatan tersebut.Dalam hal ini jawaban atas pertanyaan Anda adalah
DELETE /records?id=1&id=2&id=3
.sumber
GET /records?id=1&id=2&id=3
tidak tidak berarti “mendapatkan tiga catatan dengan ID 1, 2 & 3”, itu berarti “mendapatkan sumber daya tunggal dengan URL path / catatan? id = 1 & id = 2 & id = 3” yang mungkin menjadi gambaran lobak, teks biasa dokumen yang berisi nomor "42" dalam bahasa Cina, atau mungkin tidak ada./records?id=1
dan/records?id=2
dikirim, dan tanggapan mereka disimpan dalam cache oleh beberapa perantara (misalnya browser atau ISP Anda). Jika internet tahu apa yang dimaksud aplikasi Anda dengan ini, maka masuk akal bahwa permintaan/records?id=1&id=2
dapat dikembalikan oleh cache hanya dengan menggabungkan (entah bagaimana) dua hasil yang sudah dimilikinya, tanpa harus bertanya kepada server asal. Tapi ini tidak mungkin./records?id=1&id=2
mungkin tidak valid (hanya 1 ID diperbolehkan per permintaan) atau mungkin mengembalikan sesuatu yang sama sekali berbeda (lobak).id[]=1&id[]=2
atauid=1&id=2
dalam string kueri untuk mewakili larik nilai, string kueri itu tidak mewakili hal itu. Dan saya pikir itu sangat umum & praktik yang baik untuk memiliki string kueri yang mewakili filter. Selain itu, jika Anda mengizinkan penghapusan dan pembaruan, jangan cacheGET
permintaan. Jika Anda melakukannya, klien akan memiliki status basi.Saya pikir Mozilla Storage Service SyncStorage API v1.5 adalah cara yang baik untuk menghapus banyak catatan menggunakan REST.
Menghapus seluruh koleksi.
DELETE https://<endpoint-url>/storage/<collection>
Menghapus beberapa BSO dari koleksi dengan satu permintaan.
DELETE https://<endpoint-url>/storage/<collection>?ids=<ids>
ids : menghapus BSO dari koleksi yang idnya ada dalam daftar yang dipisahkan koma. Maksimal 100 id dapat disediakan.
Menghapus BSO di lokasi tertentu.
DELETE https://<endpoint-url>/storage/<collection>/<id>
http://moz-services-docs.readthedocs.io/en/latest/storage/apis-1.5.html#api-instructions
sumber
Ya, sejauh ini saya hanya menemukan satu panduan desain REST API yang menyebutkan operasi batch (seperti penghapusan batch): panduan desain google api .
Panduan ini menyebutkan pembuatan metode "kustom" yang dapat dikaitkan melalui sumber daya dengan menggunakan titik dua, misalnya
https://service.name/v1/some/resource/name:customVerb
, juga secara eksplisit menyebutkan operasi batch sebagai kasus penggunaan:Jadi Anda bisa melakukan yang berikut ini sesuai dengan panduan api google:
... untuk menghapus sekumpulan item sumber daya koleksi Anda.
sumber
If the HTTP verb used for the custom method does not accept an HTTP request body (GET, DELETE), the HTTP configuration of such method must not use the body clause at all,
di bab Metode Kustom. TetapiGET accounts.locations.batchGet
api adalah metode GET dengan tubuh. Itu aneh. developers.google.com/my-business/reference/rest/v4/…POST
metode http yang digunakan dan hanya metode kustom yang dinamaibatchGet
. Saya kira google melakukannya untuk (a) berpegang teguh pada aturan mereka bahwa semua metode kustom harusPOST
(lihat jawaban saya) dan (b) untuk memudahkan orang untuk meletakkan "filter" di tubuh sehingga Anda tidak perlu escape atau encode filter seperti string kueri. sisi negatifnya, tentu saja, ini tidak benar-benar dapat disimpan dalam cache lagi ...https://service.name/v1/some/resource/name:customVerb
tidak RESTful menurut definisi.Saya telah mengizinkan penggantian grosir suatu koleksi, misalnya di
PUT ~/people/123/shoes
mana tubuh adalah representasi seluruh koleksi.Ini berfungsi untuk koleksi anak kecil dari item di mana klien ingin meninjau item dan memangkas beberapa dan menambahkan beberapa lainnya dan kemudian memperbarui server. Mereka dapat MENEMPATKAN koleksi kosong untuk menghapus semua.
Ini berarti
GET ~/people/123/shoes/9
akan tetap ada dalam cache meskipun PUT menghapusnya, tetapi itu hanya masalah cache dan akan menjadi masalah jika beberapa orang lain menghapus sepatu tersebut.API data / sistem saya selalu menggunakan ETag sebagai lawan dari waktu kedaluwarsa sehingga server terkena setiap permintaan, dan saya memerlukan header versi / konkurensi yang benar untuk mengubah data. Untuk API yang hanya-baca dan tampilan / laporan selaras, saya menggunakan waktu kedaluwarsa untuk mengurangi klik pada asal, misalnya papan peringkat bisa berlangsung selama 10 menit.
Untuk koleksi yang jauh lebih besar, seperti
~/people
, saya cenderung tidak memerlukan banyak penghapusan, kasus penggunaan cenderung tidak muncul secara alami dan DELETE tunggal berfungsi dengan baik.Di masa depan, dan dari pengalaman dengan membangun REST API dan mencapai masalah dan persyaratan yang sama, seperti audit, saya cenderung hanya menggunakan kata kerja GET dan POST dan desain di sekitar peristiwa, misalnya POST peristiwa perubahan alamat, meskipun saya curiga bahwa akan datang dengan masalah tersendiri :)
Saya juga akan mengizinkan pengembang front-end untuk membangun API mereka sendiri yang menggunakan API back-end yang lebih ketat karena seringkali ada alasan sisi klien yang valid dan praktis mengapa mereka tidak menyukai desain REST API "Fielding fanatik" yang ketat, dan untuk produktivitas dan alasan pelapisan cache.
sumber