Saya pikir Anda dapat menggunakan metode POST atau PATCH untuk menangani ini karena mereka biasanya mendesain untuk ini.
Menggunakan POST
metode biasanya digunakan untuk menambahkan elemen saat digunakan pada sumber daya daftar, tetapi Anda juga dapat mendukung beberapa tindakan untuk metode ini. Lihat jawaban ini: Cara Memperbarui Koleksi Sumber Daya REST . Anda juga dapat mendukung format representasi yang berbeda untuk input (jika sesuai dengan array atau elemen tunggal).
Dalam kasus ini, tidak perlu menentukan format Anda untuk menjelaskan pembaruan.
Menggunakan PATCH
metode juga cocok karena permintaan terkait sesuai dengan pembaruan parsial. Menurut RFC5789 ( http://tools.ietf.org/html/rfc5789 ):
Beberapa aplikasi yang memperluas Hypertext Transfer Protocol (HTTP) memerlukan fitur untuk melakukan modifikasi sumber daya parsial. Metode HTTP PUT yang ada hanya memungkinkan penggantian dokumen secara lengkap. Proposal ini menambahkan metode HTTP baru, PATCH, untuk mengubah sumber daya HTTP yang ada.
Dalam kasus ini, Anda harus menentukan format Anda untuk menjelaskan pembaruan parsial.
Saya pikir dalam kasus ini, POST
dan PATCH
sangat mirip karena Anda tidak benar-benar perlu menjelaskan operasi yang harus dilakukan untuk setiap elemen. Saya akan mengatakan bahwa itu tergantung pada format representasi yang akan dikirim.
Kasusnya PUT
agak kurang jelas. Faktanya, saat menggunakan metode PUT
, Anda harus menyediakan seluruh daftar. Faktanya, representasi yang diberikan dalam permintaan akan menggantikan sumber daya daftar.
Anda dapat memiliki dua opsi terkait jalur sumber daya.
- Menggunakan jalur sumber daya untuk daftar dokumen
Dalam kasus ini, Anda perlu secara eksplisit memberikan link dokumen dengan pengikat dalam representasi yang Anda berikan dalam permintaan.
Berikut adalah contoh rute untuk ini /docs
.
Isi dari pendekatan semacam itu bisa untuk metode POST
:
[
{ "doc_number": 1, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 2, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 3, "binder": 5, (other fields in the case of creation) },
(...)
]
- Menggunakan jalur sub sumber daya elemen pengikat
Selain itu, Anda juga dapat mempertimbangkan untuk memanfaatkan sub rute untuk menggambarkan hubungan antara dokumen dan pengikat. Petunjuk tentang hubungan antara dokumen dan pengikat sekarang tidak harus ditentukan dalam konten permintaan.
Berikut adalah contoh rute untuk ini /binder/{binderId}/docs
. Dalam kasus ini, mengirimkan daftar dokumen dengan metode POST
atau PATCH
akan melampirkan dokumen ke pengikat dengan pengenal binderId
setelah membuat dokumen jika tidak ada.
Isi dari pendekatan semacam itu bisa untuk metode POST
:
[
{ "doc_number": 1, (other fields in the case of creation) },
{ "doc_number": 2, (other fields in the case of creation) },
{ "doc_number": 3, (other fields in the case of creation) },
(...)
]
Mengenai respons, terserah Anda untuk menentukan tingkat respons dan error yang akan dikembalikan. Saya melihat dua level: level status (level global) dan level muatan (level lebih tipis). Itu juga terserah Anda untuk menentukan apakah semua sisipan / pembaruan yang sesuai dengan permintaan Anda harus atom atau tidak.
Dalam hal ini, Anda dapat memanfaatkan status HTTP. Jika semuanya berjalan dengan baik, Anda mendapatkan status 200
. Jika tidak, status lain seperti 400
jika data yang diberikan tidak benar (misalnya binder id tidak valid) atau yang lainnya.
Dalam kasus ini, status 200
akan dikembalikan dan terserah representasi respons untuk menjelaskan apa yang telah dilakukan dan di mana kesalahan akhirnya terjadi. ElasticSearch memiliki titik akhir di REST API-nya untuk pembaruan massal. Ini dapat memberi Anda beberapa ide pada level ini: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html .
Anda juga dapat menerapkan pemrosesan asinkron untuk menangani data yang disediakan. Dalam hal ini, status HTTP yang dikembalikan adalah 202
. Klien perlu menarik sumber daya tambahan untuk melihat apa yang terjadi.
Sebelum menyelesaikan, saya juga ingin memperhatikan bahwa spesifikasi OData membahas masalah terkait hubungan antara entitas dengan fitur bernama tautan navigasi . Mungkin Anda bisa melihat ini ;-)
Tautan berikut juga dapat membantu Anda: https://templth.wordpress.com/2014/12/15/designing-a-web-api/ .
Semoga bisa membantu Anda, Thierry
GET /docs
dan mengambil semua dokumen dalam binder tertentuGET /docs?binder_id=x
,. Untuk menghapus subset sumber daya yang akan saya panggilDELETE /docs?binder_id=x
atau haruskah saya panggilDELETE /docs
dengan{"binder_id": x}
dalam isi permintaan? Apakah Anda pernah menggunakanPATCH /docs?binder_id=x
untuk pembaruan batch, atau hanyaPATCH /docs
dan lulus berpasangan?