Cara yang benar untuk meneruskan beberapa nilai untuk nama parameter yang sama dalam permintaan GET

194

Saya mencari cara yang benar untuk melewatkan beberapa nilai untuk nama parameter yang sama dalam permintaan GET.

Saya telah melihat URL seperti ini:

http://server/action?id=a&id=b

Dan saya telah melihat URL seperti ini:

http://server/action?id=a,b

Pemahaman saya adalah yang pertama benar, tetapi saya tidak dapat menemukan referensi untuk ini. Saya telah melihat spec http tetapi tidak bisa melihat apa-apa tentang bagaimana bagian 'permintaan' dari URL harus dibuat.

Saya tidak ingin jawaban yang mengatakan "keduanya baik-baik saja" - jika saya membangun layanan web, saya ingin tahu mana dari metode ini yang standar sehingga orang yang menggunakan layanan web saya tahu cara menyampaikan beberapa parameter untuk nama yang sama.

Jadi, dapatkah seseorang mengarahkan saya ke sumber referensi resmi untuk mengonfirmasi opsi mana yang benar?

stripybadger
sumber

Jawaban:

166

Memang, tidak ada standar yang ditentukan. Untuk mendukung informasi itu, lihat di wikipedia, di bab String Kueri . Ada komentar berikut:

Meskipun tidak ada standar yang pasti, sebagian besar kerangka kerja web memungkinkan beberapa nilai dikaitkan dengan satu bidang. [3] [4]

Selanjutnya, ketika Anda melihat pada RFC 3986 , di bagian 3.4 Query , tidak ada definisi untuk parameter dengan beberapa nilai.

Sebagian besar aplikasi menggunakan opsi pertama yang Anda telah menunjukkan: http://server/action?id=a&id=b. Untuk mendukung informasi itu, lihat tautan Stackoverflow ini , dan tautan MSDN ini mengenai aplikasi ASP.NET, yang menggunakan standar yang sama untuk parameter dengan beberapa nilai.

Namun, karena Anda sedang mengembangkan API, saya sarankan Anda melakukan apa yang paling mudah bagi Anda, karena penelepon API tidak akan mengalami banyak kesulitan dalam membuat string kueri.

EduardoFernandes
sumber
Dengan tidak adanya informasi yang bertentangan, saya kira Anda benar - jika RFC3986 tidak menentukan standar maka tidak ada satu. Terima kasih Eduardo.
stripybadger
19
A menyarankan menggunakan id=a&id=bsebagai boolean AND, dan id=a,bsebagai boolean OR.
Alex Skrypnyk
17
FWIW PHP tidak mendukung pembacaan argumen seperti ?id=5&id=3. PHP hanya akan membaca dalam satu nilai untuk id di sini. Jika saya ingat dengan benar, itu harus terlihat seperti ini agar dapat bekerja dengan PHP:?id[]=5&id[]=3
Apa yang sudah Anda coba
3
+1 untuksince you are developing the APIs, I suggest you to do what is the easiest for you, since the caller of the API will not have much trouble creating the query string.
Amr
2
id=a,bmembuat asumsi bahwa koma ,adalah pembatas yang valid. Tetapi nilai parameter Anda dapat berisi a ,. Maka klien perlu melarikan diri ,dalam nilai parameter kueri. Tapi Anda bisa memutuskan ;lebih baik. Ini berarti klien dan server harus berbagi pembatas resmi untuk API Anda. id=a&id=btidak memiliki masalah ini meskipun itu membuat url lebih lama
Ronan Quillevere
5

Saya menyarankan melihat bagaimana browser menangani formulir secara default. Sebagai contoh, lihat elemen form <select multiple>dan bagaimana ia menangani beberapa nilai dari contoh ini di w3schools.

<form action="/action_page.php">
<select name="cars" multiple>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select>
<input type="submit">
</form>

Untuk penggunaan PHP:

<select name="cars[]" multiple>

Contoh langsung dari atas di w3schools.com

Dari atas jika Anda mengklik "saab, opel" dan klik kirim, itu akan menghasilkan hasil cars = saab & cars = opel . Kemudian tergantung pada server back-end, parameter mobil harus tampil sebagai array yang dapat Anda proses lebih lanjut.

Semoga ini bisa membantu siapa pun yang mencari cara yang lebih 'standar' dalam menangani masalah ini.

phanf
sumber