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 и набором тегов сущностей, которые могут быть созданы и возвращены.