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

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

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

Кроме того, согласно этому сообщению ответ , автор предполагает, что поддержка строки запроса для массивов не определена. Это точно?

РЕДАКТИРОВАТЬ:

Основываясь на ответе @ Alex, нет стандартного способа сделать это, поэтому мое последующее исследование – это то, что является простым способом распознать, что параметр, который я читаю, представляет собой массив как в PHP, так и в Javascript ?

Было бы приемлемо назвать несколько параметров одним и тем же именем, и я узнал бы, что они принадлежат к массиву? Пример:

?myarray=value1&myarray=value2&myarray=value3... 

Или это будет плохая практика?

Вот что я понял:

Отправка полей многозначной формы, т. Е. Отправка массивов через GET / POST vars, может осуществляться несколькими различными способами, поскольку стандарт не обязательно указывается.

Три возможных способа отправки многозначных полей или массивов:

  • ?cars[]=Saab&cars[]=Audi (Лучший способ – PHP читает это в массив)
  • ?cars=Saab&cars=Audi (плохой способ – PHP будет регистрировать только последнее значение)
  • ?cars=Saab,Audi (не пробовал это)

Примеры форм

В форме многозначные поля могут принимать форму набора, установленного в несколько :

 <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[] для нескольких значений действительно плохо документировано. Я не вижу упоминания об этом в разделе о многозначных ключах в строке Query – Wikipedia или в документах W3C, касающихся входов с несколькими выборами.


ОБНОВИТЬ

Как отмечают комментаторы, это очень важно для конкретной структуры. Некоторые примеры:

Строка запроса:

 ?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" 

Угловой:

  "list_a": [ "1", "2", "3" ], "list_b[]": [ "1", "2", "3" ], "list_c": "1,2,3" 

(Угловое обсуждение )

См. Комментарии для примеров в node.js , WordPress , ASP.net


Поддержание порядка: Еще одна вещь, которую следует учитывать, заключается в том, что если вам нужно поддерживать порядок своих позиций (т. Е. Массив как упорядоченный список), у вас действительно есть только один параметр, который передает список значений с разделителями и явно преобразует его в массив самостоятельно.

Строка запроса содержит текстовые данные, поэтому нет возможности, кроме как взорвать массив, правильно закодировать его и передать в виде репрезентации по вашему выбору:

p1=value1&pN=valueN...
data=[value1,...,valueN]
data={p1:value1,...,pN:valueN}

а затем декодировать его в коде на стороне сервера.

Я не думаю, что есть стандарт.
Каждая веб-среда предоставляет свой «стандарт» для таких вещей. Кроме того, URL-адрес обычно слишком короткий для чего-либо (ограничение 256 байтов на некоторых браузерах). Конечно, более длинные массивы / данные могут быть отправлены с запросами POST.

Однако существуют некоторые методы:

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

  2. Также могут использоваться форматы обмена данными с данными (например, JSON – официальный сайт , документация по PHP ), если у них есть методы преобразования переменных в строки и из строк, как это делает JSON.
    Также необходим URL-кодер (доступный для большинства языков программирования) для HTTP-запросов для правильного кодирования строковых данных.

Хотя метод «квадратных скобок» прост и работает, он ограничен 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. 

Я считаю, что это было бы полезно для тех, кто ищет передачу массива в строке запроса сервлету. Я тестировал ниже строку запроса и смог получить значения массива с помощью req.getgetParameterValues ​​(); метод. Ниже строка запроса, которую я передал через браузер.

 "http://localhost:8080/ServletsTutorials/*.html?myname=abc&initial=xyz&checkbox=a&checkbox=b" 

checkbox – это мой массив параметров здесь.

Вы можете использовать http_build_query для генерации строки запроса с помощью URL-адреса из массива в PHP. Пока результирующая последовательность будет расширена, вы можете выбрать уникальный разделитель, который вы хотите использовать в качестве параметра для метода http_build_query , поэтому, когда дело доходит до декодирования, вы можете проверить, какой разделитель использовался. Если бы это был единственный, который вы выбрали, то это будет запрос массива, иначе это будут обычные запросы.

Вы указываете PHP и Javascript в своем вопросе, но не в тегах. Я достиг этого вопроса с целью передачи массива в действие MVC.Net.

Я нашел ответ на мой вопрос здесь : ожидаемый формат – тот, который вы предложили в своем вопросе, с несколькими параметрами с тем же именем.

Проверьте функцию 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 ?>