The Java EE 7 Tutorial
31.5 Conditional HTTP Requests
JAX-RS provides support for conditional GET
and PUT
HTTP requests. Conditional GET
requests help save bandwidth by improving the efficiency of client processing.
A GET
request can return a Not Modified (304) response if the representation has not changed since the previous request. For example, a website can return 304 responses for all its static images that have not changed since the previous request.
A PUT
request can return a Precondition Failed (412) response if the representation has been modified since the last request. The conditional PUT
can help avoid the lost update problem.
Conditional HTTP requests can be used with the Last-Modified
and ETag
headers. The Last-Modified
header can represent dates with granularity of one second.
@Path("/employee/{joiningdate}") public class Employee { Date joiningdate; @GET @Produces("application/xml") public Employee(@PathParam("joiningdate") Date joiningdate, @Context Request req, @Context UriInfo ui) { this.joiningdate = joiningdate; ... this.tag = computeEntityTag(ui.getRequestUri()); if (req.getMethod().equals("GET")) { Response.ResponseBuilder rb = req.evaluatePreconditions(tag); if (rb != null) { throw new WebApplicationException(rb.build()); } } } }
In this code snippet, the constructor of the Employee
class computes the entity tag from the request URI and calls the request.evaluatePreconditions
method with that tag. If a client request returns an If-none-match
header with a value that has the same entity tag that was computed, evaluate.Preconditions
returns a pre-filled-out response with a 304 status code and an entity tag set that may be built and returned.