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

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

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

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

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

Исходя из ответа @ Алекса, стандартного способа сделать это не существует, поэтому мое продолжение — это простой способ признать что параметр, который я читаю, является массивом в обоих PHP а также Javascript?

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

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

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

283

Решение

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

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

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

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

(ПРИМЕЧАНИЕ: в этом случае было бы важно назвать имя элемента управления 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[] для нескольких значений действительно плохо документированы. Я не вижу упоминаний об этом в разделе о многозначных ключах в Строка запроса — Википедия, или в 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


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

351

Другие решения

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

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

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

32

Я не думаю, что есть стандарт.
Каждая веб-среда предоставляет свой «стандарт» для таких вещей. Кроме того, 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.

Код для получения страницы (PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.
16

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

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

флажок — это мой массив параметров здесь.

6

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

Я нашел ответ на свой вопрос Вот: ожидаемый формат — это тот, который вы предложили в своем вопросе, с несколькими параметрами, имеющими одно и то же имя.

2

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

1

Это работает для меня:

В ссылке, чтобы атрибут имел значение->

к = «/ фильтр / обр? фруктах = яблоко&фрукты = банан»

Маршрут может справиться с этим->

Путь = «/ фильтр /: обры»

Для нескольких массивов

к = «фильтр / обр? фруктах = яблоко&фрукты = банан&овощи = картофель&овощи = лук»

Маршрут остается прежним.

СКРИНШОТ

введите описание изображения здесь

1

Проверить 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

?>
0
По вопросам рекламы [email protected]