JAX-RS обеспечивает поддержку условных HTTP-запросов GET и PUT. Условные запросы GET помогают понизить требования к пропускной способности за счёт повышения эффективности обработки клиентских запросов.
Запрос GET может вернуть ответ 304 (Not Modified), если представление не изменилось со времени предыдущего запроса. Например, веб-сайт может вернуть ответы 304 для всех своих статических изображений, которые не изменились со времени предыдущего запроса.
Запрос PUT может вернуть ответ 412 (Precondition Failed), если представление было изменено с момента последнего запроса. Условный PUT поможет избежать проблемы потерянного обновления.
Условные HTTP-запросы могут использоваться с заголовками Last-Modified и ETag. Заголовок Last-Modified может представлять дату с детализацией в одну секунду.
@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());
}
}
}
}
В этом фрагменте кода конструктор класса Employee вычисляет тег сущности из URI запроса и вызывает метод request.evaluatePreconditions с этим тегом. Если клиентский запрос возвращает заголовок If-none-match со значением, имеющим тот же тег сущности, который был вычислен, evaluate.Preconditions возвращает предварительно заполненный ответ с кодом состояния 304 и набором тегов сущностей, которые могут быть созданы и возвращены.