Obtendo Cabeçalhos HTTP Usando Objetos HttpHeaders

Usando o Java™ API for RESTful Web Services (JAX-RS), é possível usar o objeto HttpHeaders para acessar os cabeçalhos de pedido.

Sobre Esta Tarefa

Usando o objeto HttpHeaders introduzido com o ambiente de tempo de execução JAX-RS, as informações de cabeçalhos de pedido HTTP são conhecidas e disponibilizadas para modificação. A anotação @javax.ws.rs.core.Context indica que um objeto de contexto é introduzido. A interface javax.ws.rs.core.HttpHeaders é a interface do objeto que deseja introduzir.

Procedimento

  1. Determine se a sua assinatura de método pode ser modificada. Se você criou um método de recurso específico de JAX-RS, geralmente é possível modificar a assinatura de método de recurso e incluir os parâmetros facilmente porque o método não possui restrições na assinatura de método. No entanto, se seu método de recurso JAX-RS foi desenvolvido ao reutilizar o código e adaptar as classes e métodos existentes para incluir a funcionalidade JAX-RS, pode haver restrições na assinatura de método pelo código anteriormente existente que chama o método. Neste caso, talvez você não consiga modificar a assinatura de método.
  2. Se a assinatura de método do recurso puder ser modificada, inclua um parâmetro javax.ws.rs.core.HttpHeaders que esteja anotado com a anotação @javax.ws.rs.core.Context no método. Quando o método de recurso for chamado, o ambiente de tempo de execução JAX-RS transmitirá um objeto que implementa o objeto HttpHeaders, como por exemplo:
    @Path("/contextexample")
    public class RootResource {
        @GET
            public String getResource(@Context HttpHeaders httpHeaders) {
                    /* This calls a method on httpHeaders. */
                    return "The client sent a header value of " + headers.getRequestHeaders().getFirst("CustomHeader") + " for CustomHeader";
        }
    }
  3. Se uma assinatura de método de recurso não puder ser modificada e a classe for um recurso raiz, inclua um campo javax.ws.rs.core.HttpHeaders que é anotado com a anotação @javax.ws.rs.core.Context para a classe. Quando o recurso for instanciado para um pedido, um objeto que implementa HttpHeaders será introduzido, como por exemplo:
    @Path("/contextexample")
    public class RootResource {
    
        @Context
        HttpHeaders httpHeaders;
    
        @GET
        public String getResource() {
                    /* This calls a method on httpHeaders. */
                    return "The client sent a header value of " + headers.getRequestHeaders().getFirst("CustomHeader") + " for CustomHeader";
        }
    }

Resultados

O método de recurso usa as informações a partir dos cabeçalhos HTTP que são enviadas no pedido para determinar uma resposta apropriada.

Exemplo

O seguinte exemplo mostra um recurso que retorna uma saudação diferente, dependendo da configuração do cabeçalho Accept-Language.

No seguinte fragmento de código, o parâmetro @Context HttpHeaders é incluído na assinatura de método. Observe que a anotação @Context e a declaração de tipo estão na lista de parâmetros do método getGreeting.
import java.util.List; 
import java.util.Locale; 
  
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.HttpHeaders; 
import   javax.ws.rs.core.MediaType; 
  
@Path("/contexttest") 
public class HelloWorldInMyLanguage { 

    /**
     *   @return Returns the string in the preferred language.
     */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getGreeting(@Context HttpHeaders httpHeaders) {
        List<Locale> locales = httpHeaders.getAcceptableLanguages();

        if (locales.size() == 0) {
            return "Hello!";
        }

        Locale locale = locales.get(0);
        if (locale.equals(Locale.FRENCH)) {
            return "Bonjour!";
        } else if (locale.equals(Locale.GERMAN)) {
            return "Guten Tag!";
        } else {
            return "Hello!";
        }
    }
} 
Como alternativa, é possível escolher declarar a propriedade @Context HttpHeaders httpHeaders como um campo na classe, como por exemplo:
import java.util.List; 
import java.util.Locale; 
  
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.HttpHeaders; 
import   javax.ws.rs.core.MediaType; 
  
@Path("/contexttest") 
public class HelloWorldInMyLanguage { 

    @Context
    HttpHeaders httpHeaders;

    /**
     * @return Returns the string in the preferred language.
     */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getGreeting() {
        List<Locale> locales = httpHeaders.getAcceptableLanguages();

        if (locales.size() == 0) {
            return "Hello!";
        }

        Locale locale = locales.get(0);
        if (locale.equals(Locale.FRENCH)) {
            return "Bonjour!";
        } else if (locale.equals(Locale.GERMAN)) {
            return "Guten Tag!";
        } else {
            return "Hello!";
        }
    }
}

Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_contextobjects_httpheaders
Nome do arquivo: twbs_jaxrs_contextobjects_httpheaders.html