Отправить массив с 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]

когда сервер использует 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.