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?Anda mungkin perlu menggunakan POST atau PATCH, karena kecil kemungkinannya satu permintaan yang memperbarui dan membuat banyak sumber daya akan menjadi idempoten.
Melakukan
PATCH /docs
jelas merupakan pilihan yang valid. Anda mungkin menemukan penggunaan format tambalan standar rumit untuk skenario khusus Anda. Tidak yakin tentang ini.Anda bisa menggunakan 200. Anda juga bisa menggunakan 207 - Multi Status
Ini bisa dilakukan dengan cara yang tenang. Kuncinya, menurut saya, adalah memiliki beberapa sumber daya yang dirancang untuk menerima sekumpulan dokumen untuk diperbarui / dibuat.
Jika Anda menggunakan metode PATCH, menurut saya operasi Anda harus atom. yaitu, saya tidak akan menggunakan kode status 207 dan kemudian melaporkan keberhasilan dan kegagalan dalam badan tanggapan. Jika Anda menggunakan operasi POST, maka pendekatan 207 dapat digunakan. Anda harus merancang badan respons Anda sendiri untuk mengkomunikasikan operasi mana yang berhasil dan mana yang gagal. Saya tidak mengetahui yang standar.
sumber
This can be done in a RESTful way
maksud Anda Update dan Buat harus dilakukan secara terpisah?PUT ing
PUT /binders/{id}/docs
Buat atau perbarui, dan hubungkan satu dokumen ke sebuah bindermisalnya:
PATCH ing
PATCH /docs
Buat dokumen jika tidak ada dan hubungkan dengan bindermisalnya:
Saya akan menyertakan wawasan tambahan nanti, tetapi sementara itu jika Anda mau, lihat RFC 5789 , RFC 6902, dan William Durand's Please. Jangan Menambal Seperti entri blog Idiot .
sumber
docs
dan mengaitkannya denganbinders
. Klien ingin membuat pengikat jika tidak ada dan membuat pengaitan jika ada. Dalam permintaan SATU BULK.Dalam sebuah proyek tempat saya bekerja, kami memecahkan masalah ini dengan menerapkan sesuatu yang kami sebut permintaan 'Batch'. Kami menentukan jalur
/batch
tempat kami menerima json dalam format berikut:Responsnya memiliki kode status 207 (Multi-Status) dan terlihat seperti ini:
Anda juga dapat menambahkan dukungan untuk tajuk dalam struktur ini. Kami menerapkan sesuatu yang terbukti berguna yaitu variabel untuk digunakan di antara permintaan dalam satu batch, yang berarti kami dapat menggunakan respons dari satu permintaan sebagai masukan ke permintaan lainnya.
Facebook dan Google memiliki implementasi serupa:
https://developers.google.com/gmail/api/guides/batch
https://developers.facebook.com/docs/graph-api/making-multiple-requests
Ketika Anda ingin membuat atau memperbarui sumber daya dengan panggilan yang sama, saya akan menggunakan POST atau PUT tergantung pada kasusnya. Jika dokumen sudah ada, apakah Anda ingin seluruh dokumen menjadi:
Jika Anda menginginkan perilaku dari alternatif 1 Anda harus menggunakan POST dan jika Anda menginginkan perilaku dari alternatif 2 Anda harus menggunakan PUT.
http://restcookbook.com/HTTP%20Methods/put-vs-post/
Seperti yang sudah disarankan orang, Anda juga bisa menggunakan PATCH, tetapi saya lebih suka menjaga API tetap sederhana dan tidak menggunakan kata kerja tambahan jika tidak diperlukan.
sumber
--batch_xxxx
. Apakah ada perbedaan penting antara solusi Google dan Facebook? Selain itu, tentang "menggunakan tanggapan dari satu permintaan sebagai masukan ke yang lain", kedengarannya sangat menarik, maukah Anda membagikan lebih banyak detail? atau skenario seperti apa yang harus digunakan?