Для получения заголовков HTTP-запроса (HTTP Headers) есть два варианта:
- С помощью
@HeaderParam
- С помощью
@Context
Напишем простой сервис и рассмотрим все варианты:
package ru.mydesignstudio.rest; import java.util.List; import java.util.Map.Entry; import javax.ws.rs.GET; import javax.ws.rs.HeaderParam; import javax.ws.rs.Path; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; @Path("/hello") public class RestService { @GET @Path("/header") public Response header(@HeaderParam("user-agent") String userAgent) { return Response.ok() .entity("User agent is " + userAgent) .build(); } @GET @Path("/headerFromContext") public Response headerFromContext(@Context HttpHeaders headers) { String userAgent = headers.getRequestHeaders().getFirst("user-agent"); return Response.ok() .entity(userAgent) .build(); } @GET @Path("/headers") public Response headers(@Context HttpHeaders headers) { StringBuilder builder = new StringBuilder(); for (Entry<String, List<String>> entry : headers.getRequestHeaders().entrySet()) { builder.append(entry.getKey()); builder.append(":"); builder.append(StringUtils.join(entry.getValue(), ", ")); builder.append("<br>"); } return Response.ok() .entity(builder.toString()) .build(); } }
В сервисе реализованы оба способа, рассмотрим их подробно.
Используем @HeaderParam
@GET @Path("/header") public Response header(@HeaderParam("user-agent") String userAgent) { return Response.ok() .entity("User agent is " + userAgent) .build(); }
Здесь мы получаем конкретный заголовок через параметр функции. Запустив сервис и обратившись по адресу /app/services/hello/header
получим следующий ответ:

Используем @Context
@Context HttpHeaders headers
позволяет получить доступ к объекту класса HttpHeaders
, из которого можно получить конкретный заголовок или все сразу.
Получение конкретного заголовка
@GET @Path("/headerFromContext") public Response headerFromContext(@Context HttpHeaders headers) { String userAgent = headers.getRequestHeaders().getFirst("user-agent"); return Response.ok() .entity(userAgent) .build(); }
Обращаемся по адресу /app/services/hello/headerFromContext

Получение всех заголовков
Все заголовки запроса можно получить через итератор коллекции headers.getRequestHeaders()
@GET @Path("/headers") public Response headers(@Context HttpHeaders headers) { StringBuilder builder = new StringBuilder(); for (Entry<String, List<String>> entry : headers.getRequestHeaders().entrySet()) { builder.append(entry.getKey()); builder.append(":"); builder.append(StringUtils.join(entry.getValue(), ", ")); builder.append("<br>"); } return Response.ok() .entity(builder.toString()) .build(); }
Обращаемся по адресу /app/services/hello/headers
