Kami meluncurkan API REST baru dan saya ingin beberapa masukan komunitas tentang praktik terbaik seputar bagaimana kami seharusnya memiliki parameter input yang diformat:
Saat ini, API kami sangat JSON-sentris (hanya mengembalikan JSON). Perdebatan tentang apakah kita ingin / perlu mengembalikan XML adalah masalah yang terpisah.
Karena output API kami adalah JSON centric, kami telah menempuh jalan di mana input kami sedikit JSON centric dan saya telah berpikir bahwa mungkin nyaman untuk beberapa tetapi aneh pada umumnya.
Misalnya, untuk mendapatkan beberapa detail produk di mana beberapa produk dapat ditarik sekaligus saat ini kami miliki:
http://our.api.com/Product?id=["101404","7267261"]
Haruskah kita menyederhanakan ini sebagai:
http://our.api.com/Product?id=101404,7267261
Atau apakah memiliki input JSON berguna? Lebih sakit?
Kami mungkin ingin menerima kedua gaya tetapi apakah fleksibilitas itu sebenarnya menyebabkan lebih banyak kebingungan dan sakit kepala (rawatan, dokumentasi, dll.)?
Kasus yang lebih kompleks adalah ketika kami ingin menawarkan input yang lebih kompleks. Misalnya, jika kami ingin mengizinkan beberapa filter pada pencarian:
http://our.api.com/Search?term=pumas&filters={"productType":["Clothing","Bags"],"color":["Black","Red"]}
Kami tidak selalu ingin menempatkan jenis filter (mis. Jenis produk dan warna) sebagai nama permintaan seperti ini:
http://our.api.com/Search?term=pumas&productType=["Clothing","Bags"]&color=["Black","Red"]
Karena kami ingin mengelompokkan semua input filter bersama.
Pada akhirnya, apakah ini benar-benar penting? Mungkin ada begitu banyak utiliti JSON di luar sana sehingga tipe input tidak terlalu penting.
Saya tahu klien JavaScript kami yang melakukan panggilan AJAX ke API dapat menghargai input JSON untuk membuat hidup mereka lebih mudah.
[]
sintaksis tidak selalu didukung (dan meskipun umum, bahkan mungkin melanggar spesifikasi URI). Beberapa server HTTP dan bahasa pemrograman akan lebih suka hanya mengulangi namanya (misalnyaproductType=value1&productType=value2
)./user/
dan di dalam tubuh, saya akan mengirim{ q:{}, d: {} }
denganq
sebagai permintaan dengan pengguna akan ditanyai dalam DB dand
sebagai data yang dimodifikasi.Cara standar untuk meneruskan daftar nilai sebagai parameter URL adalah mengulanginya:
http://our.api.com/Product?id=101404&id=7267261
Sebagian besar kode server akan menafsirkan ini sebagai daftar nilai, meskipun banyak yang memiliki penyederhanaan nilai tunggal sehingga Anda mungkin harus mencari.
Nilai yang dibatasi juga oke.
Jika Anda perlu mengirim JSON ke server, saya tidak suka melihatnya di URL (yang merupakan format berbeda). Secara khusus, URL memiliki batasan ukuran (dalam praktiknya jika tidak secara teori).
Cara saya melihat beberapa melakukan kueri yang rumit RESTfully adalah dalam dua langkah:
POST
persyaratan kueri Anda, menerima kembali ID (dasarnya membuat sumber daya kriteria pencarian)GET
pencarian, referensi ID di atassumber
Pertama:
Saya pikir Anda bisa melakukannya dengan 2 cara
http://our.api.com/Product/<id>
: jika Anda hanya ingin satu catatanhttp://our.api.com/Product
: jika Anda ingin semua catatanhttp://our.api.com/Product/<id1>,<id2>
: seperti yang disarankan James dapat menjadi pilihan karena apa yang muncul setelah tag Produk adalah parameterAtau yang paling saya sukai adalah:
Anda dapat menggunakan properti Hypermedia sebagai mesin status aplikasi (HATEOAS) dari RestFul WS dan melakukan panggilan
http://our.api.com/Product
yang akan mengembalikan URL setarahttp://our.api.com/Product/<id>
dan memanggil mereka setelah ini.Kedua
Ketika Anda harus melakukan pertanyaan pada panggilan url. Saya akan menyarankan menggunakan HATEOAS lagi.
1) Lakukan panggilan masuk ke
http://our.api.com/term/pumas/productType/clothing/color/black
2) Lakukan panggilan masuk ke
http://our.api.com/term/pumas/productType/clothing,bags/color/black,red
3) (Menggunakan HATEOAS) Lakukan panggilan ke ` http://our.api.com/term/pumas/productType/ -> terima url semua pakaian yang memungkinkan url -> panggil yang Anda inginkan (pakaian dan tas) - > terima kemungkinan url warna -> panggil yang Anda inginkan
sumber
Anda mungkin ingin memeriksa RFC 6570 . Spesifikasi Templat URI ini menunjukkan banyak contoh bagaimana URL dapat berisi parameter.
sumber
Kasus pertama:
Pencarian produk normal akan terlihat seperti ini
http://our.api.com/product/1
Jadi saya berpikir bahwa praktik terbaik adalah bagi Anda untuk melakukan ini
http://our.api.com/Product/101404,7267261
Kasus kedua
Cari dengan parameter querystring - baik seperti ini. Saya akan tergoda untuk menggabungkan istilah dengan AND dan OR daripada menggunakan
[]
.PS Ini bisa subjektif, jadi lakukan apa yang menurut Anda nyaman.
Alasan untuk menempatkan data di url adalah agar tautan dapat ditempel di situs / dibagi di antara pengguna. Jika ini bukan masalah, gunakan JSON / POST.
EDIT: Pada refleksi saya pikir pendekatan ini sesuai dengan suatu entitas dengan kunci majemuk, tetapi bukan permintaan untuk banyak entitas.
sumber
/
tidak boleh ada karena URI membahas sumber daya, bukan koleksi.Saya akan memihak jawaban nategood karena sudah lengkap dan sepertinya sudah menyenangkan kebutuhan Anda. Meskipun demikian, saya ingin menambahkan komentar tentang mengidentifikasi beberapa (1 atau lebih) sumber daya dengan cara itu:
http://our.api.com/Product/101404,7267261
Dengan demikian, Anda:
Komplekskan klien dengan memaksa mereka untuk menafsirkan respons Anda sebagai array, yang bagi saya kontra intuitif jika saya membuat permintaan berikut:
http://our.api.com/Product/101404
Buat redundant APIs dengan satu API untuk mendapatkan semua produk dan yang di atas untuk mendapatkan 1 atau banyak. Karena Anda tidak boleh menampilkan lebih dari 1 halaman detail kepada pengguna demi UX, saya yakin memiliki lebih dari 1 ID akan sia-sia dan murni digunakan untuk memfilter produk.
Mungkin tidak bermasalah, tetapi Anda harus menangani sendiri sisi server ini dengan mengembalikan satu entitas (dengan memverifikasi apakah respons Anda mengandung satu atau lebih) atau membiarkan klien mengelolanya.
Contoh
Saya ingin memesan buku dari Amazing . Saya tahu persis buku mana itu dan saya melihatnya di daftar ketika menavigasi untuk buku-buku Horor:
Setelah memilih buku kedua, saya diarahkan ke halaman yang merinci bagian buku dari daftar:
Atau di halaman memberi saya rincian lengkap dari buku itu saja?
Pendapat saya
Saya akan menyarankan menggunakan ID dalam variabel path ketika unicity dijamin ketika mendapatkan rincian sumber daya ini. Misalnya, API di bawah ini menyarankan beberapa cara untuk mendapatkan detail untuk sumber daya tertentu (dengan asumsi produk memiliki ID unik dan spesifikasi untuk produk tersebut memiliki nama unik dan Anda dapat menavigasi dari atas ke bawah):
Saat Anda membutuhkan lebih dari 1 sumber daya, saya sarankan memfilter dari koleksi yang lebih besar. Untuk contoh yang sama:
Tentu saja, ini pendapat saya karena tidak dipaksakan.
sumber