Как я могу получить все параметры запроса в Jersey JaxRS?

#java #jersey #jax-rs

#java #джерси #jax-rs

Вопрос:

Я создаю универсальный веб-сервис, и мне нужно собрать все параметры запроса в одну строку для последующего анализа. Как я могу это сделать?

Ответ №1:

Вы можете получить доступ к одному параметру через @QueryParam("name") или ко всем параметрам через контекст:

 @POST
public Response postSomething(@QueryParam("name") String name, @Context UriInfo uriInfo, String content) {
     MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters(); 
     String nameParam = queryParams.getFirst("name");
}
  

Ключом является @Context аннотация jax-rs, которую можно использовать для доступа:

UriInfo, запрос, HttpHeaders, SecurityContext, провайдеры

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

1. Можем ли мы использовать с GET?

Ответ №2:

Неотправленная часть запроса URI запроса может быть получена из UriInfo объекта:

 @GET
public Representation get(@Context UriInfo uriInfo) {
  String query = uriInfo.getRequestUri().getQuery();
  ...
}
  

Ответ №3:

Добавляю немного больше к принятому ответу. Также возможно получить все параметры запроса следующим образом, не добавляя дополнительный параметр к методу, что может быть полезно при ведении документации swagger.

 @Context
private UriInfo uriInfo;

@POST
public Response postSomething(@QueryParam("name") String name) {
     MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters(); 
     String nameParam = queryParams.getFirst("name");
}
  

ссылка

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

1. Хотя это работает, я бы не рекомендовал это. Если вы можете сохранить функциональность кода в чистоте, вам следует попробовать — это лучший подход.

2. Несмотря на строгую корректность, я использую этот подход с суперклассом для автоматической регистрации параметров, и это работает очень хорошо. Намного чище, чем передавать параметры с каждым запросом. Иногда для функциональной чистоты нужно просто на несколько секунд отвлечься, пока прагматичное программирование берет управление клавиатурой на себя 🙂