# 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.