Kirim Array dengan HTTP Get

99

Bagaimana saya bisa mengirim Array dengan permintaan HTTP Get?

Saya Menggunakan klien GWT untuk mengirim permintaan.

Matteo
sumber
sungguh, HTML lebih baik dalam menjelaskan hal ini. <input name="user[name]" /> <input name="user[email]" />inside of a <form>container tahu persis cara mengirimkan secara default di semua browser. input akan menjadi `user [name] = SOMETEXT & user [email] [email protected] --- itu adalah aplikasi host yang diperlukan untuk menangani decoding kembali ke dalam array
Garet Claborn

Jawaban:

156

Itu tergantung pada apa yang diterima server target. Tidak ada standar yang pasti untuk ini. Lihat juga ao Wikipedia: String kueri :

Meskipun tidak ada standar yang pasti, kebanyakan kerangka kerja web memungkinkan beberapa nilai dikaitkan dengan satu bidang (misalnya field1=value1&field1=value2&field2=value3). [4] [5]

Umumnya, ketika server target menggunakan bahasa pemrograman yang diketik kuat seperti Java ( Servlet ), maka Anda dapat mengirimkannya sebagai beberapa parameter dengan nama yang sama. API biasanya menawarkan metode khusus untuk mendapatkan beberapa nilai parameter sebagai larik.

foo=value1&foo=value2&foo=value3
String[] foo = request.getParameterValues("foo"); // [value1, value2, value3]

Itu request.getParameter("foo")juga akan bekerja padanya, tetapi itu hanya akan mengembalikan nilai pertama.

String foo = request.getParameter("foo"); // value1

Dan, jika server target menggunakan bahasa dengan tipe lemah seperti PHP atau RoR, Anda perlu mencadangkan nama parameter dengan tanda kurung []untuk memicu bahasa mengembalikan larik nilai, bukan nilai tunggal.

foo[]=value1&foo[]=value2&foo[]=value3
$foo = $_GET["foo"]; // [value1, value2, value3]
echo is_array($foo); // true

Jika Anda masih menggunakan foo=value1&foo=value2&foo=value3, maka itu hanya akan mengembalikan nilai pertama.

$foo = $_GET["foo"]; // value1
echo is_array($foo); // false

Perhatikan bahwa ketika Anda mengirim foo[]=value1&foo[]=value2&foo[]=value3ke Java Servlet, Anda masih bisa mendapatkannya, tetapi Anda harus menggunakan nama parameter yang tepat termasuk tanda kurung kurawal.

String[] foo = request.getParameterValues("foo[]"); // [value1, value2, value3]
BalusC
sumber
ketika server menggunakan nodeJs, Anda cukup meneruskan array sebagai foo = [value1, value2, value3]. Saat Anda mendapatkan rute ekspres di dalam ini dengan req.query, Anda akan mendapatkan {foo: '[value1, value2, value3]'}. Anda hanya perlu mengurai & menggunakan larik ini dalam kode Anda
Akshay Barpute
omong kosong apa, pengetikan bahasa tidak ada hubungannya dengan itu
omnomnom
Ini memang tidak ditentukan. Itulah mengapa jawabannya mengatakan "Umumnya". Dalam bahasa yang diketik kuat, sufiks tanda kurung []dalam nama parameter permintaan tidak diinterpretasikan dengan cara yang sama seperti dalam bahasa dengan tipe lemah. Ini pada awalnya diperkenalkan sebagai pekerjaan internal untuk bahasa yang diketik lemah agar dapat membuat tipe variabel yang dimaksudkan. PHP adalah yang pertama melakukannya.
BalusC
Ini tidak menggeneralisasi. Tanda kurung adalah konvensi marshalling Ruby on Rails untuk mengenkode struktur bertingkat menjadi urutan datar. Zope (kerangka Python) menggunakan skema berbeda untuk kasus penggunaan yang sama . Skema ini sebagian besar telah usang oleh AJAX dan JSON. Gagasan bahwa ini harus digeneralisasikan ke sistem tipe sangat tidak masuk akal , sejujurnya.
Martijn Pieters
Dengan kata lain: masalahnya adalah string kueri tidak membawa informasi jenis, bukan karena bahasa yang mengurai string kueri diketik dengan lemah. PHP dan Ruby tidak memerlukan tanda kurung tambahan untuk menerima beberapa nilai untuk nama yang sama.
Martijn Pieters
188

Saya tahu posting ini benar-benar lama, tetapi saya harus membalas karena meskipun jawaban BalusC ditandai sebagai benar, itu tidak sepenuhnya benar.

Anda harus menulis kueri dengan menambahkan "[]" ke foo seperti ini:

foo[]=val1&foo[]=val2&foo[]=val3
David Roman
sumber
5
Senang Anda membalas postingan lama ini! Itu pasti membantu.
Tha Leang
@BalusC salah, ini berfungsi dengan baik di C / C ++ / C # (dan dapat bekerja di java). Hanya penggunaan Java Anda yang menyebabkan nama identik diinterpretasikan seperti itu. Jawaban Anda adalah penggunaan format URI yang salah
Garet Claborn
@GaretClaborn tidak yakin apa yang ingin Anda katakan, tetapi jawaban ini berhasil untuk saya
FlowUI. SimpleUITesting.com