Обработка нескольких параметров запроса в Джерси


В веб-сервисе, над которым я работаю, мне нужно реализовать 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 38

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:

Поддерживаются следующие типы:
  1. Примитивные Типы
  2. Типы
  3. , имеющие конструктор, принимающий один аргумент String.
  4. типы, имеющие статический метод с именем valueOf с одним аргументом String.
  5. 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.