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

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

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

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

EDIT:

основываясь на ответе @Alex, нет стандартного способа сделать это, поэтому мое продолжение-это то, что является простым способом узнать что параматер, который я читаю, является массивом в обоих PHP и в JavaScript?

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

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

или это плохая практика?

7 ответов


вот что я выяснил:

отправка полей многозначной формы, т. е. отправка массивов через 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[], так что результирующий запрос vars будет зарегистрирован как массив PHP)

... или как несколько скрытые поля с тем же именем:

<input type="hidden" name="cars[]" value="Volvo">
<input type="hidden" name="cars[]" value="Saab">
<input type="hidden" name="cars[]" value="Mercedes">

Примечание: используя field[] для нескольких значений действительно плохо документировано. Я не вижу упоминания об этом в разделе о многозначных ключах в строка запроса-Википедия или 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"

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

см. комментарии к примеры в узел.js, Wordpress, ASP.net


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


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

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 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.

код для получения страницы (РНР):

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

флажок-это мой массив параметров.


можно использовать 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

?>