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 saja GET
. 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:
- Membangun JSON dengan semua filter dan menormalkannya.
- Parsing ke string
- Enkode itu
- Kirim JSON yang disandikan sebagai param (
/search?q=SGVsbG8gV29ybGQh....
) permintaan .
- Di sisi server, decode param q .
- Deserialize string JSON
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.
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.