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.