Обработка нескольких параметров запроса в Джерси - PullRequest
38 голосов
/ 27 мая 2011

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

74 голосов
/ 27 мая 2011

Если вы измените тип параметра 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. Типы, которые имеютконструктор, который принимает один аргумент String.
  3. Типы со статическим методом с именем valueOf с одним аргументом String.
  4. List<T>, Set<T> илиSortedSet<T>, где <i>T</i> удовлетворяет 2 или 3 выше.
9 голосов
/ 07 февраля 2013

List<String> items=ui.getQueryParameters().get("item");

, где ui объявлено как член в остальном ресурсе следующим образом:

@Context UriInfo ui;

недостатком является то, что он не появляется в аргументах методовна все.

2 голосов
/ 09 августа 2016

Некоторые библиотеки, такие как 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) {
...
}

Проверка каждого аргумента, проверка на нулевое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...