Saya mengalami masalah dalam menemukan informasi otoritatif tentang perilaku dengan bidang duplikat string kueri HTTP GET, seperti
http://example.com/page?field=foo&field=bar
dan khususnya jika pesanan disimpan atau tidak. Sebagian besar bahasa berorientasi web menghasilkan larik yang berisi foo dan bar yang terkait dengan "bidang" kunci, tetapi saya ingin tahu apakah ada pernyataan otoritatif (misalnya pada RFC) tentang hal ini. RFC 3986 memiliki bagian 3.4. Query
, yang mengacu pada pasangan kunci = nilai, tetapi tidak ada yang dijelaskan tentang cara menafsirkan urutan dan bidang duplikat dan seterusnya. Ini masuk akal, karena itu bergantung pada backend, dan bukan dalam cakupan RFC itu ...
Meskipun standar de-facto ada, saya ingin melihat sumber resmi untuk itu, hanya karena penasaran.
Jawaban:
Tidak ada spesifikasi tentang ini. Anda dapat melakukan apa yang Anda suka.
Pendekatan tipikal meliputi: first-given, last-given, array-of-all, string-join-with-comma-of-all.
Misalkan permintaan mentahnya adalah:
Lalu ada berbagai opsi untuk apa yang
request.query['tag']
harus dihasilkan, tergantung pada bahasa atau kerangka kerjanya:sumber
Saya dapat mengonfirmasi bahwa untuk PHP (setidaknya dalam versi 4.4.4 dan yang lebih baru) berfungsi seperti ini:
menghasilkan:
Tapi
menghasilkan:
Perilaku ini sama untuk data GET dan POST.
sumber
[]
akhiran tampaknya seperti perilaku benar-benar aneh, tetapi jika Anda mencoba untuk mengirim Array sebagai argumen melalui jQuery.ajax()
, maka akan secara otomatis menambahkan mereka untuk Anda dengan cara yang sama. Sepertinya ini untuk kepentingan pengguna PHP.$foo[] = 1
ditambahkan ke sebuah array. Django (Python) juga melakukan hal yang sama.Jawaban yfeldblum sempurna.
Hanya catatan tentang perilaku kelima yang saya perhatikan baru-baru ini: di Windows Phone , membuka aplikasi dengan uri dengan kunci kueri duplikat akan mengakibatkan NavigationFailed dengan:
Pelakunya adalah
System.Windows.Navigation.UriParsingHelper.InternalUriParseQueryStringToDictionary(Uri uri, Boolean decodeResults)
.Jadi sistem tidak akan membiarkan Anda menanganinya seperti yang Anda inginkan, itu akan melarangnya. Anda memiliki satu-satunya solusi untuk memilih format Anda sendiri (CSV, JSON, XML, ...) dan uri-escape-it.
sumber
NavigationFailed
URI tersebut. Tapi, maafkan saya, saya menghentikan pengembangan Windows (Telepon) sebulan setelah posting ini dan saya pindah ke macOS (iOS), jadi saya tidak dapat membantu lagi untuk melacak masalah ini saat ini.Sebagian besar (semua?) Kerangka tidak menawarkan jaminan, jadi asumsikan kerangka tersebut akan dikembalikan dalam urutan acak.
Selalu ambil pendekatan yang paling aman.
Misalnya, antarmuka HttpServlet java: ServletRequest.html # getParameterValues
Bahkan metode getParameterMap tidak menyebutkan urutan parameter (urutan iterator java.util.Map juga tidak dapat diandalkan.)
sumber
Biasanya, nilai parameter duplikat seperti
menghasilkan parameter queryString tunggal yang berupa larik:
Saya telah melihat perilaku ini di ASP, ASP.NET, dan PHP4.
sumber
Saya memiliki pertanyaan yang sama. Saya menulis fungsi javascript untuk mengurai dan merangkai kueri. Saya tidak tahu apakah string kueri memiliki nama duplikat atau nama dengan tanda kurung, seperti x [] = 1 & x [] = 2, adalah standar meskipun beberapa bahasa mendukung format ini.
Tetapi saya menemukan bahwa Chrome dan Firefox memiliki Kelas baru bernama
URLSeachParams
dan itu hanya mendukung format yang paling sederhana sepertiname=value
. Jika ada nama duplikat dalam string kueri,get
metodeURLSearchParams
hanya mengembalikan yang pertama.Jadi secara pribadi, mungkin url nama yang paling sederhana dan tidak ada duplikat jauh lebih aman untuk masa depan.
sumber
URLSearchParams.getAll('x')