File name: twbs_jaxrs_contextobjects_httpheaders.html
Obtaining HTTP headers using HttpHeaders objects
Using Java API for
RESTful Web Services (JAX-RS), you can use the HttpHeaders object
to access request headers.
About this task
By using an injected HttpHeaders object with the JAX-RS
runtime environment, the HTTP request headers information is known
and available for modification. The @javax.ws.rs.core.Context annotation
indicates that a context object is injected. The javax.ws.rs.core.HttpHeaders
interface is the interface of the object that you want to inject.
Procedure
- Determine if your method signature can be modified.
If you have created a JAX-RS specific resource method, you can
usually modify the resource method signature and add parameters easily
because the method does not have constraints on the method signature.
However, if your JAX-RS resource method was developed by re-using
code and adapting existing classes and methods to add JAX-RS functionality,
there might be constraints on the method signature by previously existing
code that calls the method. In this case, you might not be able to
modify the method signature.
- If a resource method signature can be modified, add a javax.ws.rs.core.HttpHeaders
parameter that is annotated with the @javax.ws.rs.core.Context annotation
to the method. When the resource method is invoked, the
JAX-RS runtime environment passes an object that implements the HttpHeaders
object; for example:
@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";
}
}
- If a resource method signature cannot be modified and the
class is a root resource, add a javax.ws.rs.core.HttpHeaders field
that is annotated with the @javax.ws.rs.core.Context annotation to
the class. When the resource is instantiated for a request,
an object that implements HttpHeaders is injected; for example:
@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";
}
}
Results
The resource method uses information from the HTTP headers
that is sent in the request to determine an appropriate response.
Example
The following example illustrates a resource that returns
a different greeting depending on the setting of the Accept-Language
header.
In the following code snippet, the @Context HttpHeaders
parameter is added to the method signature. Notice that the @Context
annotation and the type declaration are in the parameters list of
the getGreeting method.
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!";
}
}
}
Alternatively, you can choose to declare the @Context
HttpHeaders httpHeaders property as a field in the class; for example:
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!";
}
}
}
In this information ...
| IBM Redbooks, demos, education, and more(Index)
Most of the following links will take you to information that is not part of the formal product documentation and is provided "as is." Some of these links go to non-IBM Web sites and are provided for your convenience only and do not in any manner serve as an endorsement by IBM of those Web sites, the material thereon, or the owner thereof.
|
|
