Apakah masuk akal jika sumber daya REST bersifat tunggal dan jamak?


10

Saya telah bertanya-tanya apakah, daripada tata letak yang lebih tradisional seperti ini:

api/Products
GET // gets product(s) by id
PUT // updates product(s) by id
DELETE // deletes (product(s) by id
POST // creates product(s)

Apakah akan lebih bermanfaat untuk memiliki bentuk tunggal dan jamak, misalnya:

api/Product
GET // gets a product by id
PUT // updates a product by id
DELETE // deletes a product by id
POST // creates a product

api/Products
GET // gets a collection of products by id
PUT // updates a collection of products by id
DELETE // deletes a collection of products (not the products themselves)
POST // creates a collection of products based on filter parameters passed

Jadi, untuk membuat koleksi produk yang mungkin Anda lakukan:

POST api/Products {data: filters} // returns api/Products/<id>

Dan kemudian, untuk referensi itu, Anda mungkin melakukan:

GET api/Products/<id> // returns array of products

Menurut pendapat saya, keuntungan utama melakukan hal-hal dengan cara ini adalah memungkinkan caching koleksi produk yang mudah. Seseorang mungkin, misalnya, menempatkan satu jam seumur hidup pada koleksi produk, sehingga secara drastis mengurangi panggilan pada server. Tentu saja, saat ini saya hanya melihat sisi baik dari melakukan hal-hal seperti ini, apa downside

Jawaban:


6

Seringkali ketika sebuah koleksi akan menjadi cara yang paling berguna untuk berinteraksi dengan api Anda, akan lebih mudah untuk hanya menganggap satu sebagai koleksi dengan hanya satu anggota. Kemudian jika nanti Anda ingin mengekspos API untuk berinteraksi dengan single, itu hanya perlu di bawah sampul mengkonversi single yang diteruskan ke koleksi dengan anggota itu dan kemudian menggunakan implementasi identik dari API lainnya.

Saya kira apa yang saya katakan di sini adalah, jika Anda ingin koleksi menjadi mekanisme interaksi, mulailah dengan koleksi hanya API dan setelah sistem selesai, API lainnya adalah pelengkap tambahan sederhana pada lapisan antarmuka yang dapat Anda tambahkan lalu jika Anda merasa sangat berguna. Namun Anda mungkin menemukan kegunaannya cukup minimal untuk menerapkan YAGNI dan cukup gunakan antarmuka koleksi untuk beberapa contoh single yang Anda inginkan.


Sementara saya setuju dengan sentimen Anda, dengan asumsi bahwa kami menggunakan contoh di atas, mengingat bahwa POST api / Produk akan digunakan untuk melewati parameter filter pengumpulan dan bukan data untuk pembuatan produk baru, apa cara yang masuk akal untuk membuat produk baru tanpa api / Produk?
Eva

@ Evan Mengapa tidak dapat memposting ke api / Produk memasukkan banyak (atau koleksi satu) Produk? Sepertinya itu yang paling masuk akal bagi saya. Mungkin memposting Produk / Filter untuk membuat filter, atau mendapatkan jika mereka mengambil dan bukan tugas kreatif.
Jimmy Hoffa

Terima kasih atas elaborasi, Jimmy. Alasan saya tidak melihatnya dengan cara ini adalah karena saya mempertimbangkan, dalam contoh di atas, koleksi sebagai sumber daya yang teridentifikasi. Di backend, api / Produk mungkin "Produk" dan api / Produk dengan demikian "ProductCollection". Namun, setelah beberapa pertimbangan, saya pikir mungkin lebih baik untuk abstrak bahwa semua jauh dari API, seperti dalam saran Anda ... sekarang ke pertanyaan sebenarnya, apakah Anda berkendara dari halte truk dalam perjalanan ke Thailand, atau pergi di bagasi mobil?
Eva

@ Evan, aku akan memberimu dua petunjuk: Seagulls.
Jimmy Hoffa

1

Kelemahannya adalah bahwa program panggilan juga harus mempluralisasi nama sumber daya, yang dapat menjadi rumit untuk bahasa klien yang tidak memiliki mekanisme pluralisasi bawaan. Jika Anda membiarkannya tunggal, lebih mudah bagi penelepon untuk mengotomatisasi pembuatan kode untuk pustaka kliennya.

Jika Anda ingin mengurangi ini, Anda dapat membuat SDK sendiri untuk layanan REST Anda. Atau, Anda bisa saja menerima pendapat dan menangani keluhan :)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.