#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. Несмотря на строгую корректность, я использую этот подход с суперклассом для автоматической регистрации параметров, и это работает очень хорошо. Намного чище, чем передавать параметры с каждым запросом. Иногда для функциональной чистоты нужно просто на несколько секунд отвлечься, пока прагматичное программирование берет управление клавиатурой на себя 🙂