Jersey JAX-RS использование @HeaderParam

Для получения заголовков HTTP-запроса (HTTP Headers) есть два варианта:

  1. С помощью @HeaderParam
  2. С помощью @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 получим следующий ответ:

JAX-RS использование @HeaderParam
JAX-RS использование @HeaderParam

Используем @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

JAX-RS использование @HeaderParam
JAX-RS использование @HeaderParam

Получение всех заголовков

Все заголовки запроса можно получить через итератор коллекции 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

JAX-RS использование @HeaderParam
JAX-RS использование @HeaderParam