Как передать массив в get запросе
Перейти к содержимому

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

  • автор:

Как передать массив как параметр строки GET-запроса в Java (Spring)?

Цель — сделать api более RESTful. Для получения ресурсов должен использоваться метод GET, но для получения списка ресурсов в контроллер должен передаваться фильтр такого вида:

@Data public class Filter < private int limit; private Listsort; public Filter(int limit, List sort) < this.limit = limit; this.sort = sort; >> 
@Data public class Sort

Из-за наличия списка List внутри фильтра, возникают проблемы с получением его в контроллере. Тщательно изучив мануал и вопрос на тему передачи объектов в строке GET-запроса, мне так и не удалось добиться успеха. По-прежнему неясно, в каком виде надо передать массив с клиента, и что сделать на сервере, чтобы он его увидел как список (происходят разного вида ошибки при маппинге фильтра). Использую такую стратегию (для получения всего, кроме списка): Контроллер:

@RequestMapping(value = "", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public List getList(@RequestParam("filter") String filterJson) < ObjectMapper mapper = new ObjectMapper(); Filter filter = null; try < filter = mapper.readValue(filterJson, Filter.class); >catch (IOException e) < e.printStackTrace(); >return getSomeDtos(filter); > 

Запрос с клиента:

http://localhost:3000/some-api?filter=%7B%22limit%22:10,%22sort%22:null%7D 

Уважаемые знатоки, вопрос — в каком виде надо передать List<> в фильтре в строке GET-запроса?

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

В прошлых темах была рассмотрена отправка на сервер отдельных значений. Однако отправка набора значений, то есть массивов в PHP может вызвать некоторые сложности. Рассмотрим, как можно отправить на сервер и соответственно получить на сервере массивы данных.

Например, определим следующий файл users.php :

 echo "В массиве " . count($users) . " элементa/ов
"; foreach($users as $user) echo "$user
"; ?>

В данном случае мы предполагаем, что параметр «users», который передается в запросе типа GET, будет представлять массив. И соответствено мы сможем получить из него данные.

Чтобы передать массив этому скрипту, обратимся к нему со следующим запросом:

http://localhost/users.php?users[]=Tom&users[]=Bob&users[]=Sam

Чтобы определить параметр строки запроса как массив, после названия параметра указываются квадраные скобки []. Затем мы можем присвоить некоторое значение: users[]=Tom . И сколько раз подобным образом будет присвоено значений, столько значений и будет в массиве. Все значения, как и обычно, отделяются амперсандом. Так, в данном случае в массив передаются три значения.

Передача массивов в PHP на сервер в запросе GET

Подобным образом мы можем отправлять данные в запросе POST из формы. Например, определим следующий скрипт:

   METANIT.COM  "; foreach($users as $user) echo "$user
"; > ?>

Форма ввода данных

User 1:

User 2:

User 3:

Как известно, название ключа передаваемых на сервер данных соответствует значению атрибута name у элемента формы. И чтобы указать, что какое-то поле ввода будет поставлять значение для массива, у атрибут name поля ввода в качестве значения принимает название массива с квадратными скобками:

Соответственно, сколько полей ввода с одним и тем же именем массива мы укажем, столько значений мы сможем передать на сервер. Так, в данном случае на сервер передается три значения в массиве users:

Отправка массивов на сервер методом POST из формы в PHP

Причем данный принцип применяется и к другим типам полей ввода формы html.

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

$firstUser = $_POST["users"][0]; echo $firstUser;

Но также мы можем в элементах формы явным образом указать ключи:

   METANIT.COM  $secondUser
$thirdUser"; > ?>

Форма ввода данных

User 1:

User 2:

User 3:

Например, первое поле добавляет в массив элемент с ключом «first»

Поэтому на сервере мы можем с помощью данного ключа получить соответствующий элемент:

$firstUser = $_POST["users"]["first"];

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

Существует ли стандартный способ передачи массива через строку запроса? Чтобы быть ясным, у меня есть строка запроса с несколькими значениями, одна из которых будет значением массива. Я хочу, чтобы это значение строки запроса обрабатывалось как массив. Я не хочу, чтобы массив был взорван, чтобы он был неотличим от других переменных строки запроса. Кроме того, в соответствии с этим post answer автор предполагает, что поддержка строки запроса для массивов не определена. Это точно? EDIT: Основываясь на ответе @Alex, стандартного способа сделать это не существует, поэтому мое наблюдение — это то, что является простым способом распознать, что параметр, который я читаю, представляет собой массив как в PHP и Javascript? Было бы приемлемо назвать несколько параметров одним и тем же именем, и я узнал бы, что они принадлежат к массиву? Пример:

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

Или это будет плохая практика?
Yarin 05 июнь 2011, в 14:10
Поделиться

Какие рамки вы используете? В некоторых инфраструктурах есть методы, помогающие передавать массивы в строки запросов.

keyboardP 05 июнь 2011, в 13:10
@ keyboardP — PHP и Javascript, в зависимости от варианта использования
Yarin 05 июнь 2011, в 13:31

Почему вы хотите сделать это, когда вы можете просто сделать:? Myarray = значение1, значение2, значение3

Serodis 05 июнь 2011, в 13:32

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

Передача массива методом GET

Решение:
Передать массив методом GET на другую страницу можно через параметры строки запроса. Запрос должен быть вида: 2.php?arr[]=value1&arr[]=value2&arr[]=value3. . Где value1 — это первый элемент массива, value2 — это второй элемент массива и т.д.

Файл 2.php

// Распечатываем массив echo "
"; print_r($_GET); echo "

";

implode — Объединяет элементы массива в строку.

string implode( string glue, array pieces ) Возвращает строку, полученную объединением строковых представлений элементов массива pieces, со вставкой строки glue между соседними элементами.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *