Обработка нескольких параметров запроса в Джерси
В веб-сервисе, над которым я работаю, мне нужно реализовать 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)
Остается открытым вопрос о том, как реализовать несколько значения одного и того же параметра.
3 ответа:
Если вы измените тип вашего параметра метода
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 выше.
List<String> items=ui.getQueryParameters().get("item");
Где
ui
объявляется членом в REST-ресурсе следующим образом:@Context UriInfo ui;
Недостатком является то, что он вообще не появляется в аргументах методов.
Некоторые библиотеки, такие как axios js, используют обозначение квадратных скобок при отправке многозначного запроса param: / stats?магазин[]=а&магазин[]=B и пункт[]=C и пункт[]=Д
Для обработки всех случаев (с квадратными скобками или без них) вы можете добавить еще один параметр, например:
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.