Mengikuti prinsip REST, saya ingin membuat metode GET untuk API saya yang melakukan pencarian menggunakan beberapa kriteria dan mengembalikan hasilnya ke klien. Masalahnya adalah bahwa kriteria dapat memiliki hingga 14 parameter, salah satunya adalah daftar objek yang kompleks, jadi ...
Saya bahkan tidak tahu apakah mungkin untuk menyandikan / mendekodekan objek kompleks ini ke / dari parameter url.
Saya tidak menghitung berapa lama url bisa didapat tetapi saya yakin itu akan cukup besar dan mungkin mencapai batas panjang url?
Juga, pencarian harus menunjukkan hasil dalam "waktu nyata", maksud saya, setiap kali pengguna mengubah sesuatu dari formulir pencarian dia harus dapat melihat hasil baru tanpa menekan tombol "pencarian".
Bisakah Anda mengklarifikasi poin-poin ini kepada saya dan apa saran Anda untuk membuat metode pencarian yang tenang dengan banyak parameter?
search?q=t
,search?q=te
,search?q=test
, dan sebagainya. Pertimbangkan untuk membatasi seberapa sering permintaan dikirimkan untuk menghindari melukai server Anda. Anda juga bisa mengembalikan banyak informasi dan di sisi klien melakukan penyaringan. Itu bekerja dengan baik jika pengguna memasukkan kategori luas yang dapat mempersempit banyak hal.Jawaban:
Sebelum Anda membaca jawaban saya, saya ingin mengatakan bahwa saya setuju dengan @Neil. Kita harus memilih pertempuran kita. Kami biasanya ingin melakukan yang terbaik, tetapi kadang-kadang ada terlalu sedikit ruang untuk diskusi dan kami harus membuat keputusan yang bertentangan dengan keinginan kami.
Bagaimanapun, dalam jawaban Neil, aku kehilangan satu hal lagi. Dokumentasi . Hanya untuk memastikan bahwa pengembang tahu bahwa permintaan POST
/search
aman.Itu kata.
1. Berikan kesempatan untuk MENDAPATKAN
Pertimbangkan
GET
opsi tersebut terlebih dahulu. Lihat panjang maksimal URL pertanyaan ini . Evaluasi apakah string kueri terpanjang Anda lebih dari 2000 karakter. Jika tidak, dan Anda tidak mengharapkannya, ikuti sajaGET
. Ini mungkin tampak jelek, tetapi setidaknya Anda dapat mem-bookmark URL dan, tentu saja, ia memiliki semua keuntungan yang didapat dari semantik metode (idempotensi, aman, dan cache)1.1 Cobalah meng-encode string kueri
Misalnya, dalam basis 64. Bahkan javascript mendukung basis 64 encodings .
Beginilah cara kerjanya:
/search?q=SGVsbG8gV29ybGQh....
) permintaan .Sebelumnya, buat string JSON terpanjang yang mungkin, disandikan dan ambil panjangnya. Evaluasi apakah string yang disandikan cocok dengan URL. Saya telah menerapkan cuplikan berikut pada Fiddle.js untuk Anda uji. (Saya harap ini masih berfungsi) 1
Encode Base 64 bersifat deterministik dan dapat dibalik, sehingga tidak ada kemungkinan tabrakan.
Dengan kueri yang disandikan, kami juga dapat menyimpan pencarian di DB, mem-bookmark URL, membagikan tautan, dll. Dan, tentu saja, kami tidak harus melarikan diri / menghilangkan jejak string.
1.2 Coba dengan alias
Membaca blog ini tentang cara mendesain API REST, saya ingat satu alternatif lagi. Alias untuk pertanyaan umum .
Saya menemukan ini menarik karena alasan berikutnya
Persingkat panjang string kueri. Itu membuat API lebih bersih dan ramah pengguna
DAPATKAN / tiket /? Status = ditutup & ditutupAt = xxx vs GET / tiket / baru-baru ini ditutup /
Dapat dikombinasikan dengan alias atau parameter permintaan lainnya.
DAPATKAN / tiket /? Status = ditutup & ditutupAt = xxx & dalam = 30 mnt vs GET / tiket / baru-baru ini ditutup /? Dalam = 30 mnt
Kami dapat menggabungkan alias dengan string kueri yang disandikan
DAPATKAN / tiket /? Status = ditutup & ditutupAt = xxx & dalam = 30 mnt vs GET / tiket / baru-baru ini ditutup /? Q = SGVsbG8g ...
1: Saya telah menggunakan JSON, tetapi kita bisa menggunakan format lain segera setelah kita dapat deserialize di sisi server.
sumber
Jika yang Anda miliki adalah palu, semuanya terlihat seperti paku. Tampaknya masalah di sini adalah Anda mencoba mengubah halaman pencarian menjadi RESTful, dan ini sepertinya bukan pola yang umum untuk dipecahkan oleh desain RESTful.
Cukup pergi dengan permintaan POST dengan parameter yang disediakan oleh pengguna untuk mendapatkan informasi yang Anda butuhkan dari backend. Saya berasumsi Anda tidak perlu melakukan apa pun selain melakukan pencarian, jadi Anda tidak perlu memasukkan halaman ini. Cukup tambahkan a / search ke akhir URL Anda sehingga Anda tidak berisiko mengalami konflik dengan halaman / pengguna Anda yang akan TENANG.
sumber
Ini sepenuhnya tergantung pada apa model API Anda: Karena tidak ada atau sebagai kata kerja.
Jika API bukan, maka Anda mungkin ingin mendapatkan daftar objek sebagai berikut:
Dalam hal ini Anda harus mengirim data sebagai parameter permintaan. Jadi, Anda harus menggambarkan parameter Anda sebagai daftar kunci dari nilai kunci:
Beberapa platform mendukung resolver parameter khusus (mis. Spring MVC), dan Anda dapat mengubah params menjadi objek.
sumber