Подтвердить что ты не робот

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

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

Остается вопрос о том, как реализовать несколько значений одного и того же параметра.

4b9b3361

Ответ 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.