Saya memiliki koleksi produk dalam grup produk, misalnya:
product-groups/123/products
Jika saya perlu menambah koleksi, apakah boleh saya hanya melewati beberapa produk dengan PUT?
Jika saya perlu menghapus beberapa produk dari koleksi, apakah boleh saya melewati data filter (array ID) dengan DELETE?
Apa cara terbaik untuk mengimplementasikan fungsionalitas dalam semangat ReST?
Sunting: item adalah tautan ke entitas yang terpisah, pada dasarnya ID produk.
rest
collections
pengguna151851
sumber
sumber
Jawaban:
Secara umum, Anda memiliki satu titik akhir yang mewakili seluruh koleksi x :
Katakanlah, Anda ingin memperbarui satu produk, Anda membuat PUT ke
/products/{id}
. Jika Anda ingin memperbarui sebagian produk tunggal (tidak memperbarui setiap bidang), Anda juga dapat menggunakan PATCH untuk/products/{id}
. Hal yang sama berlaku untuk penghapusan satu entitas ( HAPUS ke/products/{id}
).Jika Anda ingin menargetkan sumber daya tunggal , Anda memenuhi syarat melalui jalur, sumber daya tunggal mana, yang ingin Anda modifikasi.
Satu-satunya tindakan yang memecah skema adalah penciptaan sumber daya. Saat membuat sumber daya Anda menargetkan koleksi secara keseluruhan, katakan POST ke
/products
.Karena itu, harus jelas, bahwa target untuk operasi yang mempengaruhi pengumpulan secara keseluruhan, harus pergi ke pengumpulan-endpoint yang sesuai.
Misalnya Anda ingin mengambil subset dari produk yang berwarna merah, Anda memintanya
GET untuk
/products?colour=red
.Jadi, jika Anda ingin menghapus semua ini, Anda HAPUS
/products?colour=red
. Atau jika Anda ingin menghapus beberapa produk melaluiid
, Anda bisa HAPUS/products?id=1&id=2&id=3
.Bagaimana dengan pembuatan sumber daya massal ? POST koleksi Anda
[{...},{...},{...}]
hanya untuk/products
. Hal yang sama berlaku untuk PUT dan PATCH .Itu sangat mudah.
Untuk menjawab pertanyaan Anda:
Tidak hanya OK, Anda didorong untuk melakukannya seperti itu.
Tidak apa-apa. Seperti yang dituliskan oleh Eneko Alonso, kadang-kadang ada operasi massal yang dienkapsulasi melalui "controller" -poin, yaitu POST digunakan untuk memicu operasi (kompleks).
sumber
PATCH
, dan penggantian lengkap, melaluiPUT
.Biasanya, metode REST dimaksudkan untuk beroperasi pada satu entitas / objek (CRUD).
Ada beberapa opsi:
Yang pertama mengikuti standar REST, tetapi bisa mahal, karena objek koleksi Anda / entitas mungkin sangat besar (memperbarui grup yang memiliki ribuan produk hanya untuk menambah / menghapus satu produk akan menjadi permintaan berat).
Opsi kedua lebih disukai oleh banyak API, sebagai cara untuk memperpanjang REST di luar operasi CRUD.
Sebagai contoh:
Banyak API selalu menggunakan POST untuk operasi yang diperluas ini, tetapi tidak ada yang membatasi Anda untuk menggunakan metode http lainnya (selain dari batasan GET dan DELETE untuk memiliki badan kosong)
sumber
products/collection
yang mengembalikan 'amplop' item dan konten amplop diubah melalui PUT? Seperti, "inilah tepatnya yang saya inginkan dari item dalam koleksi".Hanya untuk menjawab jawaban / komentar sebelumnya.
Sesuai pengetahuan saya, POST adalah metode untuk menambahkan elemen tunggal ke koleksi.
DELETE pada gilirannya, adalah metode untuk menghapus elemen tunggal dari koleksi. Kedua skenario itu benar-benar tenang.
Namun, Anda harus menggunakan URI yang sesuai untuk merujuk elemen tunggal atau seluruh koleksi.
Misalnya, untuk menambahkan elemen ke koleksi Anda harus POST data ke URI berikut:
Untuk menghapus satu produk dari koleksi, Anda dapat menggunakan metode DELETE mengirim permintaan ke sesuatu seperti:
Metode PATCH dapat digunakan untuk memperbarui beberapa elemen dalam koleksi. Misalnya, ketika Anda hanya perlu memperbarui satu bidang dalam satu elemen. MENEMPATKAN representasi sumber daya lengkap untuk koleksi yang sangat besar dapat menjadi operasi yang sangat mahal.
sumber
Pada prinsipnya, semua operasi RESTful berlaku pada koleksi, tetapi pastikan Anda memahami bagaimana semantik kata kerja berlaku untuk koleksi:
PUT adalah pengganti yang lengkap .
/item/{id}
) dan meninggalkanname
keluar, itu harus dibersihkan atau diatur ke nol atau sesuatu yang serupa.Sementara PUT dapat digunakan untuk menambahkan item, Anda harus mengirim "semua" item. Mengirim "beberapa" item harus menghasilkan kepindahan (saya menganggap ini adalah bukan apa keinginan OP).
HAPUS lebih intuitif. Adalah sah untuk menghapus koleksi atau bagian yang difilter daripadanya. Hanya item yang termasuk dalam filter yang akan terpengaruh.
PATCH juga valid. Secara teori, Anda seharusnya memberikan daftar "operasi". Misalnya, Anda harus mengirim sesuatu seperti:
Dalam praktiknya, lebih umum untuk melihat API yang menerima sebagian daftar objek tempat setiap item diproses menggunakan logika UPSERT (perbarui atau masukkan).
Secara teknis, POST harus memproses input "sesuai dengan semantik spesifik sumber daya itu sendiri".
{resource}/activate
.CATATAN: Saat menggunakan operasi non-GET pada koleksi, pertimbangkan dengan hati-hati definisi keberhasilan dan kegagalan. REST tidak memberi Anda cara yang baik untuk mengomunikasikan keberhasilan parsial. Default yang baik adalah dengan menganggap bahwa Anda akan menjalankan operasi dalam transaksi dengan kriteria keberhasilan semua atau tidak sama sekali. Jika ini bukan yang Anda inginkan, Anda mungkin tidak boleh berinteraksi dengan koleksi secara langsung.
sumber