Saya memiliki dua sumber: pengguna dan tautan.
Pengguna dapat memiliki beberapa tautan yang dikaitkan dengannya. Saya telah merancang API RESTful saya sehingga Anda dapat mencapai tautan yang dikaitkan dengan pengguna di URI berikut:
/users/:id/links
Namun, saya selalu perlu memiliki URI untuk tautan yang adil - terkadang saya mungkin ingin semua tautan, terlepas dari pengguna.
Untuk ini saya punya:
/links
Apakah ini terdengar oke? Memiliki dua URI untuk tautan?
Saya ingin tahu apakah saya seharusnya menjangkau tautan untuk pengguna dengan URI seperti:
/links/user/:id
atau /links/?user=:id
Dengan cara ini, saya hanya memiliki satu sumber daya untuk tautan.
api
rest
api-design
Oliver Joseph Ash
sumber
sumber
/links/user/:id
/users/:id/links
) atau metode string kueri (/links/?user=:id
) karena sebenarnya adalah query./links/user/:id
mungkin terlihat bagus dan / atau lebih mudah untuk dirutekan dalam beberapa kerangka kerja tetapi sebenarnya cukup membingungkan.Jawaban:
Tidak, tidak ada yang salah dengan memiliki banyak sumber daya untuk "hal" yang sama, dalam hal ini daftar tautan.
Kami baru-baru ini berjuang dengan masalah yang sama. Keputusan kami adalah untuk memiliki semua sumber daya di mana tidak ada kepemilikan yang ketat untuk tidak disarangkan. Dengan kata lain, tautan akan dimodelkan di bawah
Lalu, filter pada koleksi tautan dinyatakan sebagai parameter kueri. Jadi untuk mendapatkan tautan dari pengguna tertentu, Anda akan menggunakan:
Ini juga memungkinkan komposisi filter lebih mudah:
Dan mudah dipahami secara konseptual - Anda memiliki koleksi item, dan Anda menambahkan filter padanya.
Yang sedang berkata, tidak ada yang lebih "tenang" tentang pendekatan ini daripada skema penamaan URI lainnya. Itu hanya sebuah konvensi yang kami temukan dapat dibaca manusia dan mudah bagi kami para pengembang untuk memahami dan merangkulnya. REST tidak peduli dengan apa yang Anda masukkan ke pengidentifikasi sumber daya Anda.
sumber
?user=users/:userid
di dalam string kueri; apa yang salah dengan adil?userid=:userid
?"/*******"
; di mana*
itu buram. tetapi pengenal yang sama selalu dapat digunakan untuk merujuk ke sumber daya itu (seperti dalam, dengan tautan), untuk mengambil versi terbaru dari sumber daya itu, dan seterusnya. konten uri itu hanya dipahami oleh server asal. Ini juga berarti bahwa jika pengidentifikasi perlu berubah, katakanlah/realm/:businessid/users/:id
, klien tidak berubah sama sekali./users/:userid/links
dan/links?userid=:userid
? Dalam kedua kasus, pengidentifikasi tidak berubah, mereka mengambil versi sumber daya saat ini, dan klien memperlakukannya dengan cara yang sama. Tidak ada yang namanya URL kanonik untuk ini karena ini bukan sumber daya, ini kueri, jadi ini hanya dua jenis sintaksis kueri yang berbeda. Saya juga tidak jelas tentang bagaimana klien tidak perlu mengubah jika struktur URL berubah; itu dianggap sebagai perubahan besar dalam REST kecuali 301 ada di tempat./links
mendukung antarmuka kueri,/links?user=/users/123
memungkinkan pendekatan kotak hitam untuk pengidentifikasi sumber daya di klien yang/links?userid=123
tidak. yang terakhir mengharuskan klien memahami apa itu userid dan bagaimana cara mendapatkannya, mungkin dari sumber daya yang diperolehnya dari/users/123
atau/links/456/user
. Yang pertama berarti klien dapat menggunakan uri yang tidak dimodifikasi; seandainya/links/.../user
memberikan respons hypermedia (katakanlah, denganLocation:
header).Jadi kekhawatiran saya adalah: / pengguna /: userid / tautan mengembalikan "tautan", TETAPI jika user_id tidak diidentifikasi, ini akan mengembalikan 404.
Namun
/ links? userid =: userid berpotensi mengembalikan daftar kosong (pada dasarnya 200) yang sebenarnya adalah bug. Dan sangat mungkin.
Meskipun keduanya berfungsi, sarang memberi Anda fungsionalitas tambahan yang nantinya dapat Anda manfaatkan.
sumber