Отправить массив с HTTP Get

99

Как я могу отправить массив с HTTP-запросом Get?

Я использую клиент GWT для отправки запроса.

Маттео
источник
на самом деле HTML лучше освещает это. <input name="user[name]" /> <input name="user[email]" />внутри <form>контейнера точно знает, как отправить по умолчанию во всех браузерах. входные данные станут ʻuser [name] = SOMETEXT & user [email] =SOME@TEXT.com --- это хост-приложение, которое требуется для обработки декодирования обратно в массив
Garet Claborn

Ответы:

156

Это зависит от того, что принимает целевой сервер. Для этого нет окончательного стандарта. См. Также ao Wikipedia: Строка запроса :

Хотя окончательного стандарта не существует, большинство веб-фреймворков позволяют связывать несколько значений с одним полем (например, field1=value1&field1=value2&field2=value3). [4] [5]

Как правило, когда целевой сервер использует язык программирования со строгой типизацией, такой как Java ( сервлет ), вы можете просто отправить их как несколько параметров с одинаковым именем. API обычно предлагает специальный метод для получения значений нескольких параметров в виде массива.

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

Он request.getParameter("foo")также будет работать с ним, но вернет только первое значение.

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

И, когда целевой сервер использует язык со слабой типизацией, такой как PHP или RoR, вам необходимо добавить к имени параметра суффикс фигурных скобок [], чтобы язык возвращал массив значений вместо одного значения.

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

Если вы все еще используете foo=value1&foo=value2&foo=value3, он вернет только первое значение.

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

Обратите внимание, что когда вы отправляете foo[]=value1&foo[]=value2&foo[]=value3сервлету Java, вы все равно можете их получить, но вам нужно будет использовать точное имя параметра, включая фигурные скобки.

String[] foo = request.getParameterValues("foo[]"); // [value1, value2, value3]
BalusC
источник
когда сервер использует nodeJs, вы можете просто передать массив как foo = [значение1, значение2, значение3]. Когда вы получите этот внутри экспресс-маршрута с помощью req.query, вы получите {foo: '[значение1, значение2, значение3]'}. Вам просто нужно его разобрать и использовать этот массив в своем коде
Акшай Барпут
что за чушь, языковая типизация тут ни при чем
omnomnom
Это действительно не указано. Именно поэтому ответ гласит: «Обычно». В языках со строгой типизацией суффиксы []в скобках в именах параметров запроса интерпретируются иначе, чем в языках со слабой типизацией. Первоначально он был введен как внутреннее решение для языков со слабой типизацией, чтобы иметь возможность создавать предполагаемый тип переменной. PHP был первым, кто сделал это.
BalusC
Это не обобщает. Скобки - это соглашение о маршалинге Ruby on Rails для кодирования вложенной структуры в плоскую последовательность. Zope (фреймворк Python) использовал другую схему для того же варианта использования . Эти схемы в основном устарели благодаря AJAX и JSON. Честно говоря, идея о том, что это должно быть обобщено на системы типов, очень надуманная .
Мартейн Питерс
Иными словами: проблема в том, что строка запроса не содержит информации о типе, а не в том, что язык, анализирующий строку запроса, имеет слабую типизацию. PHP и Ruby не требуют дополнительных скобок, чтобы принимать несколько значений для одного и того же имени.
Мартейн Питерс
188

Я знаю, что этот пост действительно старый, но я должен ответить, потому что, хотя ответ BalusC отмечен как правильный, он не совсем правильный.

Вы должны написать запрос, добавляющий «[]» в foo, вот так:

foo[]=val1&foo[]=val2&foo[]=val3
Давид Роман
источник
5
Рад, что вы ответили на этот старый пост! Это определенно помогло.
Tha Leang
@BalusC неверен, это отлично работает в C / C ++ / C # (и может работать в java). Только ваше использование Java приводит к интерпретации идентичных имен как таковых. Однако ваш ответ - неправильное использование форматирования URI
Гарет Клаборн,
@GaretClaborn не уверен, что вы пытаетесь сказать, но этот ответ работает для меня
FlowUI. SimpleUITesting.com