Как передать массив в строке запроса?
есть стандартный способ передачи массива через строку запроса?
чтобы быть ясным, у меня есть строка запроса с несколькими значениями, одно из которых будет значением массива. Я хочу, чтобы это значение строки запроса обрабатывалось как массив - я не хочу, чтобы массив был разнесен так, чтобы он был неотличим от других переменных строки запроса.
кроме того, согласно этому ответу на сообщение, автор предполагает, что поддержка строк запроса для массивов не определена. Заключаться в следующем точно?
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[]для нескольких значений действительно плохо документированы. Я не вижу никакого упоминания об этом в разделе о многозначных ключах в строка запроса-Wikipedia или W3C docs работа с несколькими входами выбора.
обновление
как отмечали комментаторы, это очень специфично для рамок. Некоторые примеры:
строка запроса:
?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
порядок: Еще одна вещь, чтобы рассмотреть, что если вам нужно поддерживать элемент ордер из ваших элементов (т. е. массив в виде упорядоченного списка) у вас действительно есть только один вариант, который передает разделенный список значений и явно преобразует его в массив самостоятельно.
строка запроса содержит текстовые данные, поэтому нет никакой возможности, кроме как взорвать массив, правильно закодировать его и передать его в выбранном вами формате представления:
p1=value1&pN=valueN...data=[value1,...,valueN]data={p1:value1,...,pN:valueN}а затем декодировать его в коде на стороне сервера.
Я не думаю, что есть стандартная.
Каждая веб-среда предоставляет свой собственный "стандарт" для таких вещей. Кроме того, 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):
$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 в своем вопросе, но не в тегах. Я достиг этого вопроса с намерением передать массив в an 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 ?>
Comments