Network Deployment (Distributed operating systems), v8.0 > End-to-end paths > Web services - RESTful services > Use JAX-RS context objects to obtain more information about requests > 4. Add context fields and parameters to obtain information about requests.
Evaluate request preconditions using Request objects
Use Java API for RESTful Web Services (JAX-RS), you can use the Request object to access request headers. The Request object provides methods for evaluating preconditions and for selecting the optimal response variant based on the request headers.
By using an injected Request object with the JAX-RS runtime environment, you can easily evaluate HTTP headers preconditions. The @javax.ws.rs.core.Context annotation indicates that a context object is injected. The javax.ws.rs.core.Request is the interface of the object to inject. The injected Request object is useful in evaluating HTTP header preconditions with dates, such as the If-Modified-Since value and entity tags such as If-Match.
We can also use the Request object when implementing advanced content negotiation.
To learn more about content negotiation, read about using XML content in JAX-RS application requests and responses. The granularity of dates used in HTTP headers is not as precise as some dates used in data sources. For example, the precision for a date in a database row might be defined to the millisecond. However, the date in an HTTP header field is only precise to seconds. When evaluating HTTP preconditions, if you compare a java.util.Date object to the date in an HTTP header, the difference in precision might produce unexpected results.
To avoid this problem, normalize the java.util.Date object before comparing to the date value in the HTTP header.
Procedure
- If a resource method signature can be modified, add the @javax.ws.rs.core.Context javax.ws.rs.core.Request parameter to the method. When the resource method is invoked, the JAX-RS runtime environment passes an object that implements the Request object; for example:
@Path("/contextexample") public class RootResource { @GET @Produces("text/plain") public Response getResource(@Context Request requestObj) { Date lastModified = /* Gets the last modified date of this resource from a data source. */; ResponseBuilder possibleResponse = requestObj.evaluatePreconditions(lastModified); /* If the preconditions are not met, then ResponseBuilder is not null. Return the automatically generated response. */ if (possibleResponse != null) { return possibleResponse.build(); } return Response.ok("a resource representation").lastModified(lastModified).build(); } }
- If a resource method signature cannot be modified and the class is a root resource, add the @javax.ws.rs.core.Context javax.ws.rs.core.Request field. When the resource is instantiated for a request, an object that implements Request is injected; for example:
@Path("/contextexample") public class RootResource { @Context Request requestObj; @GET @Produces("text/plain") public Response getResource() { Date lastModified = /* Gets the last modified date of this resource from a data source */; ResponseBuilder possibleResponse = requestObj.evaluatePreconditions(lastModified); /* If the preconditions are not met, then ResponseBuilder is not null. Return the automatically generated response */ if (possibleResponse != null) { return possibleResponse.build(); } return Response.ok("a resource representation").lastModified(lastModified).build(); } }
Results
You have used the javax.ws.rs.core.Request object to evaluate the HTTP headers of an incoming request, and determine the proper response to the request.
Use JAX-RS context objects to obtain more information about requests
Obtaining HTTP headers using HttpHeaders objects
Obtaining information about URIs using UriInfo objects
Determine security information using SecurityContext objects
Use content negotiation to serve multiple content types in JAX-RS applications
Related
Web services specifications and APIs