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

#java #rest #path #jersey

#java #остальное #путь #джерси

Вопрос:

В веб-службе, над которой я работаю, мне нужно реализовать URI с параметрами запроса, которые выглядят как /stats?store=Aamp;store=Bamp;item=Camp;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. Вы можете упростить свой код, написав: @QueryParam(«хранить»)

Ответ №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 аннотации:

Поддерживаются следующие типы:

  1. Примитивные типы
  2. Типы, у которых есть конструктор, который принимает один String аргумент.
  3. Типы, у которых есть статический метод, названный valueOf с одним String аргументом.
  4. List<T> , Set<T> или SortedSet<T> где T удовлетворяет 2 или 3 выше.

Комментарии:

1. Однако определение List<String> не работает. Я полагаю, ArrayList<String> будет служить той же цели?

2. List item не сработало, и ArrayList<String> item просто сломал мой код … есть другие предложения?

3. @ZKSteffel: Не уверен, почему это не сработает, поскольку я провел быстрый тест, и у меня это сработало. Я отредактирую свой ответ, чтобы показать полный метод, который я использовал. Можете ли вы дать мне больше информации о том, что не удалось?

4. Оказывается, я импортировал List из неправильного пакета, и мой код начал вызывать сбои. Теперь у меня это работает. Спасибо за помощь!

5. @Teivere: Это было бы www.myurl.com/foo?item=listitem1amp;item=listitem2

Ответ №2:

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

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

 @Context UriInfo ui;
  

недостатком является то, что это вообще не отображается в аргументах методов.

Комментарии:

1. Хотя этот плакат отвечал на неправильный вопрос, это был вопрос, который я погуглил, поэтому я должен повысить его, поскольку это помогло мне. @Tal спасибо.

Ответ №3:

Некоторые библиотеки, такие как axios js, используют обозначения в квадратных скобках при отправке запроса параметров с несколькими значениями: /stats?store[]=Aamp;store[]=Bamp;item[]=Camp;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.