Как передать массив в строке запроса?
Существует ли стандартный способ передачи массива через строку запроса?
Чтобы быть ясным, у меня есть строка запроса с несколькими значениями, одна из которых будет значением массива. Я хочу, чтобы это значение строки запроса обрабатывалось как массив. Я не хочу, чтобы массив был взорван, чтобы он был неотличим от других переменных строки запроса.
Кроме того, в соответствии с этим post answer автор предполагает, что поддержка строки запроса для массивов не определена. Это точно?
EDIT:
Основываясь на ответе @Alex, стандартного способа сделать это не существует, поэтому мое наблюдение - это то, что является простым способом распознать, что параметр, который я читаю, представляет собой массив как в PHP и Javascript?
Было бы приемлемо назвать несколько параметров одним и тем же именем, и я узнал бы, что они принадлежат к массиву? Пример:
?myarray=value1&myarray=value2&myarray=value3...
Или это будет плохая практика?
Ответы
Ответ 1
Вот что я понял:
Отправка полей многозначной формы, т.е. отправка массивов через GET/POST-вары, может выполняться несколькими различными способами, поскольку стандарт не обязательно должен быть прописан.
Три возможных способа отправки многозначных полей или массивов:
-
?cars[]=Saab&cars[]=Audi
(Лучший способ - PHP читает это в массив)
-
?cars=Saab&cars=Audi
(Плохой путь - PHP будет регистрировать только последнее значение)
-
?cars=Saab,Audi
(Не пробовал это)
Примеры форм
В форме многозначные поля могут принимать форму окна select, установленного на несколько:
<form>
<select multiple="multiple" name="cars[]">
<option>Volvo</option>
<option>Saab</option>
<option>Mercedes</option>
</select>
</form>
(ПРИМЕЧАНИЕ. В этом случае было бы важно назвать элемент управления select some_name[]
, так что результирующие запросы будут зарегистрированы как массивы PHP)
... или как несколько скрытых полей с тем же именем:
<input type="hidden" name="cars[]" value="Volvo">
<input type="hidden" name="cars[]" value="Saab">
<input type="hidden" name="cars[]" value="Mercedes">
ПРИМЕЧАНИЕ. Использование field[]
для нескольких значений действительно плохо документировано. Я не вижу упоминания об этом в разделе о многозначных ключах в строке запроса - Wikipedia или в W3C docs, посвященные входам с несколькими входами.
UPDATE
Как отмечают комментаторы, это очень специфично для конкретной структуры. Некоторые примеры:
Строка запроса:
?list_a=1&list_a=2&list_a=3&list_b[]=1&list_b[]=2&list_b[]=3&list_c=1,2,3
Рельсы:
"list_a": "3",
"list_b":[
"1",
"2",
"3"
],
"list_c": "1,2,3"
Angular:
"list_a": [
"1",
"2",
"3"
],
"list_b[]": [
"1",
"2",
"3"
],
"list_c": "1,2,3"
(Angular обсуждение)
См. комментарии для примеров в node.js, Wordpress, ASP.net
Поддержание порядка:
Еще одна вещь, которую следует учитывать, состоит в том, что если вам нужно поддерживать порядок своих элементов (т.е. Массив как упорядоченный список), у вас действительно есть только один параметр, который передает список значений с разделителями и явно преобразует его в массив самостоятельно.
Ответ 2
Строка запроса содержит текстовые данные, поэтому нет возможности, кроме как взорвать массив, правильно закодировать его и передать в виде репрезентации по вашему выбору:
p1=value1&pN=valueN...
data=[value1,...,valueN]
data={p1:value1,...,pN:valueN}
а затем декодируйте его в коде на стороне сервера.
Ответ 3
Я не думаю, что есть стандарт.
Каждая веб-среда предоставляет свой "стандарт" для таких вещей. Кроме того, URL-адрес обычно слишком короткий для чего-либо (ограничение в 256 байт в некоторых браузерах). Конечно, более длинные массивы/данные могут быть отправлены с запросами POST.
Однако есть несколько методов:
-
Есть способ PHP, который использует квадратные скобки ([
, ]
) в URL-запросах. Например, такой запрос, как ?array_name[]=item&array_name[]=item_2
, как говорят, работает, хотя и плохо документирован, с помощью PHP, автоматически преобразующего его в массив. Источник: fooobar.com/questions/31416/...
-
Форматы обмена объектными данными (например, JSON - официальный сайт, документация PHP) также могут использоваться, если у них есть методы преобразования переменных в и из строк, как это делает JSON.
Кроме того, url-кодировщик (доступный для большинства языков программирования) требуется для запросов HTTP get для правильного кодирования строковых данных.
Хотя "метод квадратных скобок" прост и работает, он ограничен PHP и массивами.
Если требуются другие типы переменных, такие как классы или передаваемые переменные в строках запроса на языке, отличном от PHP, рекомендуется метод JSON.
Пример в PHP метода JSON (метод 2):
$myarray = array(2, 46, 34, "dfg");
$serialized = json_encode($myarray)
$data = 'myarray=' . rawurlencode($serialized);
// Send to page via cURL, header() or other service.
Код для получения страницы (PHP):
$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.
Ответ 4
Я чувствую, что это будет полезно для тех, кто ищет передачу массива в строке запроса сервлету. Я протестировал приведенную ниже строку запроса и смог получить значения массива с помощью req.getgetParameterValues(); метод. Ниже приведена строка запроса, которую я пропустил через браузер.
http://localhost:8080/ServletsTutorials/*.html?
myname=abc&initial=xyz&checkbox=a&checkbox=b
флажок - это мой массив параметров здесь.
Ответ 5
Вы указываете PHP и Javascript в своем вопросе, но не в тегах. Я достиг этого вопроса с целью передачи массива в действие MVC.Net.
Я нашел ответ на свой вопрос здесь: ожидаемый формат - тот, который вы предложили в своем вопросе, с несколькими параметрами с тем же именем.
Ответ 6
Вы можете использовать http_build_query для генерации строки запроса с помощью URL-адреса из массива в PHP. Пока результирующая последовательность будет расширена, вы можете выбрать уникальный разделитель, который вы хотите как параметр для метода http_build_query
, поэтому, когда дело доходит до декодирования, вы можете проверить, какой разделитель использовался. Если бы это был единственный, который вы выбрали, то это будет запросом массива, иначе это будут обычные запросы.
Ответ 7
Это работает для меня:
В ссылке, чтобы атрибут имел значение:
to="/filter/arr?fruits=apple&fruits=banana"
Маршрут может справиться с этим:
path="/filter/:arr"
Для нескольких массивов:
to="filter/arr?fruits=apple&fruits=banana&vegetables=potato&vegetables=onion"
Маршрут остается прежним.
СКРИНШОТ
![enter image description here]()
Ответ 8
Проверьте функцию parse_string
http://php.net/manual/en/function.parse-str.php
Он вернет все переменные из строки запроса, включая массивы.
Пример из php.net:
<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first; // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz
parse_str($str, $output);
echo $output['first']; // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz
?>
Ответ 9
Если вы хотите использовать ?cars=Saab,Audi
. Для подготовки строки запроса может потребоваться немного JavaScript.
Вот пример:
JavaScript
$('#form-filter').submit(function () {
event.preventDefault();
var cars = [];
$('input[name="select_cars"]:checked').each(function (i) {
cars.push($(this).val());
});
var url = new URL(window.location.href);
var query_string = url.search;
var search_params = new URLSearchParams(query_string);
if (cars.length == 0) {
search_params.delete('select_cars');
}
else {
search_params.set('select_cars', cars.join(','));
}
url.search = search_params.toString();
var new_url = url.toString();
window.location.replace(decodeURIComponent(new_url));
});
PHP
$carsFilter = $_SERVER['select_cars'];
if ($carsFilter) {
// Converts carsFilter from String to an array.
$carsFilter = preg_split ("/\,/", $carsFilter);
}
HTML
<label><input name="select_cars" type="checkbox" value="Audi" />Audi</label>
<label><input name="select_cars" type="checkbox" value="Saab" />Saab</label>
Это выглядит аккуратно при работе с массивом строк запроса из многих элементов.