Obtención de cabeceras HTTP utilizando objetos HttpHeaders

Mediante la utilización de la API Java™ para RESTful Web Services (JAX-RS), puede emplear el objeto HttpHeaders para acceder a cabeceras de solicitud.

Acerca de esta tarea

Mediante un objeto HttpHeaders inyectado con el entorno de ejecución de JAX-RS, se conoce la información de las cabeceras de solicitud HTTP y está disponible para su modificación. La anotación @javax.ws.rs.core.Context indica que se ha inyectado un objeto de contexto. La interfaz javax.ws.rs.core.HttpHeaders es la interfaz del objeto que desee inyectar.

Procedimiento

  1. Determine si la firma de método se puede modificar. Si ha creado un método de recursos JAX-RS específico, normalmente puede modificar la firma del método de recursos y añadir parámetros con facilidad ya que el método no tiene restricciones en cuanto a la firma del método. Sin embargo, si el método de recursos JAX-RS se ha desarrollado reutilizando código y adaptando clases y métodos existentes para añadir funcionalidad JAX-RS, es posible que haya restricciones en cuanto a la firma del método respecto al código anterior existente que llama al método. En este caso, es posible que no pueda modificar la firma del método.
  2. Si se puede modificar la firma de un método de recursos, añada un parámetro javax.ws.rs.core.HttpHeaders que se anota con la anotación @javax.ws.rs.core.Context al método. Cuando se invoca al recurso, el entorno de ejecución de JAX-RS pasa un objeto que implementa el objeto HttpHeaders; por ejemplo:
    @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. Si no se puede modificar la firma del método de recursos y la clase no es un recurso root, añada un campo javax.ws.rs.core.HttpHeaders que se anota con la anotación @javax.ws.rs.core.Context a la clase. Cuando se crea una instancia del recurso para una solicitud, se inyecta un objeto que implementa HttpHeaders; por ejemplo:
    @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

El método de recursos utiliza la información de las cabeceras HTTP que se envían en la solicitud para determinar una respuesta apropiada.

Ejemplo

En el ejemplo siguiente se muestra un recurso que devuelve un saludo diferente según el valor de la cabecera Idioma aceptado.

En el siguiente fragmento de código, el parámetro @Context HttpHeaders se agrega a la firma del método. Observe que la anotación @Context y el tipo de declaración están en la lista de parámetros del 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, puede decidir declarar la propiedad @Context HttpHeaders httpHeaders como un campo de la clase; por ejemplo:
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!";
        }
    }
}

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_contextobjects_httpheaders
File name: twbs_jaxrs_contextobjects_httpheaders.html