Обработка нескольких параметров запроса в Джерси
В веб-службе, над которой я работаю, мне нужно реализовать URI с параметрами запроса, которые выглядят как /stats?store=A&store=B&item=C&item=D
Чтобы разбить его, мне нужно иметь возможность использовать параметры запроса для указания данных из нескольких/всех магазинов и данных для нескольких/всех элементов из этих хранилищ. До сих пор я смог реализовать один аргумент запроса только для того, чтобы вытащить данные элемента, но я потерял его в том, как реализовать больше запросов и не могу найти ресурсы, которые я видел до того, как сделка с этой реализацией.
То, что у меня до сих пор в моем методе, соответствует строкам
@GET
@Path("stats")
public String methodImCalling(@DefaultValue("All") @QueryParam(value = "item") final String item)
{
/**Run data using item as variable**/
return someStringOfData
}
который хорошо работает для одного элемента и будет возвращать все данные, если я не буду вводить параметр в URI. Однако я не уверен, как обрабатывать больше параметров, чем это.
Обновление
Я выяснил, как использовать 2 разных параметра, просто добавив второй аргумент в метод следующим образом:
public String methodImCalling(@DefaultValue("All") @QueryParam(value = "store") final String store,
@DefaultValue("All") @QueryParam(value = "item") final String item)
Остается вопрос о том, как реализовать несколько значений одного и того же параметра.
Ответы
Ответ 1
Если вы измените тип параметра item
метода из String
в коллекцию, например List<String>
, вы должны получить коллекцию, содержащую все значения, которые вы ищете.
@GET
@Path("/foo")
@Produces("text/plain")
public String methodImCalling(@DefaultValue("All")
@QueryParam(value = "item")
final List<String> item) {
return "values are " + item;
}
Спецификация JAX-RS (раздел 3.2) описывает следующее в отношении аннотации @QueryParam
:
Поддерживаются следующие типы:
- Примитивные типы
- Типы, которые имеют конструктор, который принимает один аргумент
String
.
- Типы, которые имеют статический метод с именем
valueOf
с одним аргументом String
.
-
List<T>
, Set<T>
или SortedSet<T>
, где T
удовлетворяет выше 2 или 3.
Ответ 2
List<String> items=ui.getQueryParameters().get("item");
где ui
объявляется как член в остальном ресурсе, например:
@Context UriInfo ui;
Недостатком является то, что он вообще не отображается в аргументах методов.
Ответ 3
Некоторые библиотеки, такие как axios js, используют обозначение квадратных скобок при отправке многозначного запроса параметра:/stats? store [] = A & store [] = B & item [] = C & item [] = D
Чтобы обрабатывать все случаи (с квадратными скобками или без них), вы можете добавить еще один параметр:
public String methodImCalling(
@QueryParam(value = "store") final List<String> store,
@QueryParam(value = "store[]") final List<String> storeWithBrackets,
@QueryParam(value = "item") final List<String> item,
@QueryParam(value = "item[]") final List<String> itemWithBrackets) {
...
}
Проверка каждого аргумента, проверяющего значение null.