#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
аннотации:
Поддерживаются следующие типы:
- Примитивные типы
- Типы, у которых есть конструктор, который принимает один
String
аргумент.- Типы, у которых есть статический метод, названный
valueOf
с однимString
аргументом.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.