Есть ли стандартный способ передачи массива через строку запроса?
Чтобы было ясно, у меня есть строка запроса с несколькими значениями, одним из которых будет значение массива. Я хочу, чтобы это значение строки запроса обрабатывалось как массив - я не хочу, чтобы массив разбирался так, чтобы он был неотличим от других переменных строки запроса.
Также, согласно этому посту , автор предполагает, что поддержка строк в массивах не определена. Это точно?
РЕДАКТИРОВАТЬ:
Основываясь на ответе @ Alex, стандартного способа сделать это не существует, поэтому я продолжу: как легко определить, что параметр, который я читаю, представляет собой массив как в PHP, так и в Javascript ?
Было бы приемлемо назвать несколько параметров одним и тем же именем, и таким образом я бы знал, что они принадлежат массиву? Пример:
?myarray=value1&myarray=value2&myarray=value3...
Или это будет плохая практика?
Ответы:
Вот что я понял:
Отправка полей формы с несколькими значениями, т. Е. Отправка массивов с помощью переменных GET / POST, может осуществляться несколькими различными способами, поскольку стандарт не обязательно прописан.
Три возможных способа отправки многозначных полей или массивов:
?cars[]=Saab&cars[]=Audi
(Лучший способ - PHP читает это в массив)?cars=Saab&cars=Audi
(Плохой путь - PHP будет регистрировать только последнее значение)?cars=Saab,Audi
(Не пробовал это)Примеры форм
В форме многозначные поля могут принимать форму поля выбора, установленного в несколько значений :
(ПРИМЕЧАНИЕ. В этом случае было бы важно назвать имя
some_name[]
элемента управления select , чтобы результирующие переменные запроса были зарегистрированы PHP как массив)... или как несколько скрытых полей с одинаковым именем :
ПРИМЕЧАНИЕ. Использование
field[]
нескольких значений действительно плохо документировано. Я не вижу упоминаний об этом в разделе о многозначных ключах в строке запроса - в Википедии или в документах W3C, посвященных множественному выбору входных данных.ОБНОВИТЬ
Как отметили комментаторы, это очень сильно зависит от структуры. Некоторые примеры:
Строка запроса:
Рельсы:
Угловой:
(Угловая дискуссия )
Смотрите комментарии для примеров в node.js , Wordpress , ASP.net
Поддержание порядка: еще одна вещь, которую следует учитывать, это то, что если вам нужно поддерживать порядок ваших элементов (т.е. массив как упорядоченный список), у вас действительно есть только одна опция, которая передает разделенный список значений и явно конвертирует его в массив сам.
источник
?cars=Saab&cars=Audi
форму?cars=Saab&cars=Audi
и?cars[]=Saab&cars[]=Audi
превращаются в массивы. Тем не менее,?cars=Saab
заканчивается как строка, но?cars[]=Saab
представляет собой массив с одним элементом.?cars[]=Saab&cars[]=Audi
Квадратные скобки либо отсутствуют, либо квадратные скобки нуждаются в индексах /Строка запроса содержит текстовые данные, поэтому нет другого выбора, кроме как взорвать массив, правильно его кодировать и передать в выбранном вами формате представления:
p1=value1&pN=valueN...
data=[value1,...,valueN]
data={p1:value1,...,pN:valueN}
а затем декодировать его в коде на стороне сервера.
источник
JSON.stringify
иJSON.parse
!json_encode
thenrawurlencode
иjson_decode
на другой странице.Я не думаю, что есть стандарт.
Каждая веб-среда предоставляет свой «стандарт» для таких вещей. Кроме того, URL-адрес обычно слишком короткий для чего-либо (ограничение 256 байтов в некоторых браузерах). Конечно, более длинные массивы / данные могут быть отправлены с запросами POST.
Однако есть несколько методов:
Есть способ PHP, который использует квадратные скобки (
[
,]
) в запросах URL. Например, такой запрос, как?array_name[]=item&array_name[]=item_2
говорят, работает, несмотря на то, что он плохо документирован, а PHP автоматически преобразует его в массив. Источник: https://stackoverflow.com/a/9547490/3787376Форматы обмена объектными данными (например, JSON - официальный веб-сайт , документация PHP ) также могут использоваться, если у них есть методы преобразования переменных в и из строк, как это делает JSON.
Кроме того, url-кодировщик (доступный для большинства языков программирования) необходим для запросов HTTP get для правильного кодирования строковых данных.
Хотя «метод квадратных скобок» прост и работает, он ограничен PHP и массивами.
Если требуются другие типы переменных, такие как классы или передаваемые переменные в строках запроса на языке, отличном от PHP, рекомендуется использовать метод JSON.
Пример в PHP метода JSON (метод 2):
Код для получения страницы (PHP):
источник
Я чувствую, что это будет полезно для тех, кто ищет передачу массива в строке запроса сервлету. Я протестировал приведенную ниже строку запроса и смог получить значения массива с помощью req.getgetParameterValues (); метод. Ниже приведена строка запроса, которую я пропустил через браузер.
флажок - это мой массив параметров здесь.
источник
Это работает для меня:
В ссылке, чтобы атрибут имел значение:
Маршрут может справиться с этим:
Для нескольких массивов:
Маршрут остается прежним.
СКРИНШОТ
источник
Вы упоминаете PHP и Javascript в своем вопросе, но не в тегах. Я дошел до этого вопроса с намерением передать массив в действие MVC.Net.
Я нашел ответ на свой вопрос здесь : ожидаемый формат - это тот, который вы предложили в своем вопросе, с несколькими параметрами, имеющими одно и то же имя.
источник
Я использую React и Rails. Я сделал:
JS
источник
Вы можете использовать http_build_query для генерации строки запроса в кодировке URL из массива в PHP. Хотя результирующая строка запроса будет расширена, вы можете выбрать уникальный разделитель, который вы хотите использовать в качестве параметра
http_build_query
метода, поэтому, когда дело доходит до декодирования, вы можете проверить, какой разделитель использовался. Если бы он был уникальным, то это будет строка запроса массива, иначе это будут обычные строки запроса.источник
Хотя в части URL нет стандарта, для JavaScript есть один стандарт. Если вы передаете объекты, содержащие массивы
URLSearchParams
, и вызываетеtoString()
их, он преобразует их в список элементов, разделенных запятыми:источник
Проверьте
parse_string
функцию http://php.net/manual/en/function.parse-str.phpОн вернет все переменные из строки запроса, включая массивы.
Пример с php.net:
источник