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.