Saya ingin membuat API TENANG saya sangat mudah diprediksi. Apa praktik terbaik untuk memutuskan kapan harus melakukan segmentasi data menggunakan URI daripada menggunakan params kueri.
Masuk akal bagi saya bahwa parameter sistem yang mendukung pagination, sorting, dan pengelompokan setelah '?' Tetapi bagaimana dengan bidang seperti 'status' dan 'wilayah' atau atribut lain yang mengelompokkan koleksi Anda? Jika itu juga harus params kueri, apa aturan praktis mengetahui kapan harus menggunakan path params?
Jawaban:
Praktik terbaik untuk desain API RESTful adalah bahwa params jalur digunakan untuk mengidentifikasi sumber daya atau sumber daya tertentu, sementara parameter kueri digunakan untuk mengurutkan / memfilter sumber daya tersebut.
Ini sebuah contoh. Misalkan Anda menerapkan titik akhir API RESTful untuk entitas yang disebut Mobil. Anda akan menyusun titik akhir Anda seperti ini:
GET
/cars
GET
/cars/:id
POST
/cars
PUT
/cars/:id
DELETE
/cars/:id
Dengan cara ini Anda hanya menggunakan parameter jalur saat menentukan sumber daya yang akan diambil, tetapi ini tidak mengurutkan / memfilter sumber daya dengan cara apa pun.
Sekarang anggaplah Anda ingin menambahkan kemampuan untuk memfilter mobil berdasarkan warna dalam permintaan GET Anda. Karena warna bukan sumber daya (ini adalah properti dari sumber daya), Anda bisa menambahkan parameter kueri yang melakukan ini. Anda akan menambahkan parameter permintaan itu ke permintaan GET
/cars
Anda seperti ini:DAPATKAN
/cars?color=blue
Titik akhir ini akan diterapkan sehingga hanya mobil biru yang akan dikembalikan.
Sejauh menyangkut sintaksis, nama URL Anda harus semuanya huruf kecil. Jika Anda memiliki nama entitas yang umumnya dua kata dalam bahasa Inggris, Anda akan menggunakan tanda hubung untuk memisahkan kata-kata, bukan huruf unta.
Ex.
/two-words
sumber
Cara mendasar untuk memikirkan hal ini adalah sebagai berikut:
URI adalah pengidentifikasi sumber daya yang secara unik mengidentifikasi contoh spesifik dari TIPE sumber daya. Seperti semua hal lain dalam hidup, setiap objek (yang merupakan turunan dari beberapa jenis), memiliki serangkaian atribut yang entah waktu-invarian atau temporal.
Dalam contoh di atas, mobil adalah objek yang sangat nyata yang memiliki atribut seperti make, model, dan VIN - yang tidak pernah berubah, dan warna, suspensi, dll. Yang mungkin berubah seiring waktu. Jadi jika kita menyandikan URI dengan atribut yang dapat berubah dari waktu ke waktu (temporal), kita mungkin berakhir dengan beberapa URI untuk objek yang sama:
Dan bertahun-tahun kemudian, jika warna mobil yang sama ini diubah menjadi hitam:
Perhatikan bahwa instance mobil itu sendiri (objek) tidak berubah - itu hanya warna yang berubah. Memiliki beberapa URI yang menunjuk ke instance objek yang sama akan memaksa Anda untuk membuat beberapa penangan URI - ini bukan desain yang efisien, dan tentu saja tidak intuitif.
Karena itu, URI hanya boleh terdiri dari bagian-bagian yang tidak akan pernah berubah dan akan terus mengidentifikasi sumber daya tersebut secara unik sepanjang masa pakainya. Segala sesuatu yang dapat berubah harus disediakan untuk parameter kueri, seperti:
Intinya - pikirkan polimorfisme.
sumber
Di REST API, Anda seharusnya tidak terlalu khawatir dengan URI yang dapat diprediksi. Saran dari prediktabilitas URI menyinggung kesalahpahaman arsitektur RESTful. Ini mengasumsikan bahwa klien harus membangun URI sendiri, yang seharusnya tidak harus dilakukan.
Namun, saya berasumsi bahwa Anda tidak membuat API REST yang sebenarnya, tetapi API yang 'diilhami REST' (seperti Google Drive). Dalam kasus ini aturan praktisnya adalah 'path params = identifikasi sumber daya' dan 'query params = pengurutan sumber daya'. Jadi, pertanyaannya menjadi, bisakah Anda mengidentifikasi sumber daya Anda secara unik TANPA status / wilayah? Jika ya, maka mungkin ini adalah parameter kueri. Jika tidak, maka ini adalah param path.
HTH.
sumber
Setelah saya merancang API sumber daya utama itu
people
. Biasanya pengguna akan meminta difilterpeople
sehingga, untuk mencegah pengguna memanggil sesuatu seperti/people?settlement=urban
setiap kali, saya menerapkannya/people/urban
yang kemudian memungkinkan saya untuk dengan mudah menambahkan/people/rural
. Ini juga memungkinkan untuk mengakses/people
daftar lengkap jika nanti dapat digunakan. Singkatnya, alasan saya adalah menambahkan jalur ke himpunan bagian umumDari sini :
sumber
Secara umum, saya cenderung menggunakan parameter path ketika ada 'hierarki' yang jelas di sumber daya, seperti:
Jika sumber daya tunggal itu memiliki status, seseorang dapat:
Namun, jika 'wilayah' tidak benar-benar bagian dari sumber daya yang diekspos, itu mungkin termasuk sebagai salah satu parameter kueri - mirip dengan pagination (seperti yang Anda sebutkan).
sumber
Segmentasi lebih hierarkis dan "cantik" tetapi bisa membatasi.
Misalnya, jika Anda memiliki url dengan tiga segmen, masing-masing melewati parameter berbeda untuk mencari mobil melalui merek, model, dan warna:
Ini adalah url yang sangat cantik dan lebih mudah diingat oleh pengguna akhir, tetapi sekarang jenis Anda terjebak dengan struktur ini. Katakanlah Anda ingin membuatnya sehingga dalam pencarian pengguna dapat mencari SEMUA mobil biru, atau SEMUA Honda Civic? Parameter kueri memecahkan ini karena memberikan pasangan nilai kunci. Jadi Anda bisa lulus:
Sekarang Anda memiliki cara untuk referensi nilai melalui kunci itu - baik "warna" atau "membuat" dalam kode kueri Anda.
Anda bisa menyiasatinya dengan kemungkinan menggunakan lebih banyak segmen untuk membuat semacam struktur nilai kunci seperti:
Harapan itu masuk akal ..
sumber
URL contoh:
/rest/{keyword}
URL ini adalah contoh untuk parameter jalur. Kami bisa mendapatkan data URL ini dengan menggunakan
@PathParam
.URL contoh:
/rest?keyword=java&limit=10
URL ini adalah contoh untuk parameter kueri. Kami bisa mendapatkan data URL ini dengan menggunakan
@Queryparam
.sumber