Как передать массив в строке запроса?

Существует ли стандартный способ передачи массива через строку запроса?

Чтобы быть ясным, у меня есть строка запроса с несколькими значениями, одна из которых будет значением массива. Я хочу, чтобы это значение строки запроса обрабатывалось как массив. Я не хочу, чтобы массив был взорван, чтобы он был неотличим от других переменных строки запроса.

Кроме того, в соответствии с этим 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.

Однако есть несколько методов:

  1. Есть способ PHP, который использует квадратные скобки ([, ]) в URL-запросах. Например, такой запрос, как ?array_name[]=item&array_name[]=item_2, как говорят, работает, хотя и плохо документирован, с помощью PHP, автоматически преобразующего его в массив. Источник: fooobar.com/questions/31416/...

  2. Форматы обмена объектными данными (например, 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>

Это выглядит аккуратно при работе с массивом строк запроса из многих элементов.