Wyślij tablicę za pomocą polecenia HTTP Get


99

Jak mogę wysłać tablicę z żądaniem HTTP Get?

Używam klienta GWT do wysyłania żądania.


naprawdę, HTML lepiej to naświetla. <input name="user[name]" /> <input name="user[email]" />wewnątrz <form>kontenera wie dokładnie, jak przesłać domyślnie we wszystkich przeglądarkach. dane wejściowe staną się 'użytkownik [nazwa] = SOMETEXT & user [email] =SOME@TEXT.com --- jest to aplikacja hosta, która jest wymagana do obsługi dekodowania z powrotem do tablicy
Garet Claborn

Odpowiedzi:


156

To zależy od tego, co akceptuje serwer docelowy. Nie ma na to ostatecznego standardu. Zobacz też ao Wikipedia: Ciąg zapytania :

Chociaż nie ma ostatecznego standardu, większość platform internetowych umożliwia skojarzenie wielu wartości z jednym polem (np field1=value1&field1=value2&field2=value3.). [4] [5]

Ogólnie rzecz biorąc, gdy serwer docelowy używa silnego języka programowania, takiego jak Java ( Servlet ), możesz po prostu wysłać je jako wiele parametrów o tej samej nazwie. API zwykle oferuje dedykowaną metodę uzyskiwania wartości wielu parametrów w postaci tablicy.

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

request.getParameter("foo")Będzie również działać na nim, ale będzie to powrót tylko pierwszą wartość.

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

A gdy serwer docelowy używa słabego języka typowanego , takiego jak PHP lub RoR, musisz dodać przyrostek do nazwy parametru nawiasami klamrowymi [], aby język zwrócił tablicę wartości zamiast pojedynczej wartości.

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

Jeśli nadal używasz foo=value1&foo=value2&foo=value3, zwróci tylko pierwszą wartość.

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

Zwróć uwagę, że wysyłając foo[]=value1&foo[]=value2&foo[]=value3do serwletu Java, nadal możesz je uzyskać, ale musisz użyć dokładnej nazwy parametru, w tym nawiasów klamrowych.

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

gdy serwer używa nodeJs, możesz po prostu przekazać tablicę jako foo = [wartość1, wartość2, wartość3]. Gdy uzyskasz to wewnątrz trasy ekspresowej z req.query, otrzymasz {foo: '[wartość1, wartość2, wartość3]'}. Wystarczy go przeanalizować i użyć tej tablicy w swoim kodzie
Akshay Barpute

co za bzdury, pisanie językowe nie ma z tym nic wspólnego
omnomnom

To jest rzeczywiście nieokreślone. Właśnie dlatego odpowiedź brzmi „Ogólnie”. W językach z silną typizacją przyrostki nawiasów []w nazwach parametrów żądania nie są interpretowane w taki sam sposób, jak w językach ze słabymi typami. Został pierwotnie wprowadzony jako wewnętrzne obejście dla słabo typowanych języków, aby móc stworzyć zamierzony typ zmiennej. PHP był pierwszym, który to zrobił.
BalusC

To nie uogólnia. Nawiasy są konwencją krosowania Ruby on Rails do kodowania zagnieżdżonej struktury w płaską sekwencję. Zope (Python framework) użył innego schematu dla tego samego przypadku użycia . Te schematy zostały w większości przestarzałe przez AJAX i JSON. Pomysł, że powinno to zostać uogólnione na systemy typów, jest bardzo daleko idący , szczerze mówiąc.
Martijn Pieters

Mówiąc inaczej: problem polega na tym, że ciąg zapytania nie zawiera informacji o typie, a nie to, że język analizujący ciąg zapytania jest napisany słabo. PHP i Ruby nie wymagają dodatkowych nawiasów, aby akceptować wiele wartości dla tej samej nazwy.
Martijn Pieters

187

Wiem, że ten post jest naprawdę stary, ale muszę odpowiedzieć, ponieważ chociaż odpowiedź BalusC jest oznaczona jako poprawna, nie jest całkowicie poprawna.

Musisz napisać zapytanie dodając "[]" do foo w ten sposób:

foo[]=val1&foo[]=val2&foo[]=val3

5
Cieszę się, że odpowiedziałeś na ten stary post! To zdecydowanie pomogło.
Tha Leang

@BalusC niepoprawne, działa to doskonale w C / C ++ / C # (i może działać w Javie). Tylko użycie Javy powoduje, że identyczne nazwy są interpretowane jako takie. Twoja odpowiedź to nieprawidłowe użycie formatowania URI
Garet Claborn

@GaretClaborn nie jestem pewien, co próbujesz powiedzieć, ale ta odpowiedź działa dla mnie
FlowUI. SimpleUITesting.com
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.