type=page
status=published
title=Conditional HTTP Requests
next=jaxrs-advanced006.html
prev=jaxrs-advanced004.html
~~~~~~
Conditional HTTP Requests
=========================

[[GKQDA]]

[[conditional-http-requests]]
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.

[source,oac_no_warn]
----
@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.


