HTTPQUERY
Русский

If-Match

Применение

Заголовок If-Match обеспечивает условные запросы путём сравнения значений ETag. Клиент включает этот заголовок, чтобы сервер обработал запрос только тогда, когда текущий тег сущности ресурса совпадает с одним из перечисленных значений.

Для безопасных методов вроде GET и HEAD заголовок If-Match ограничивает ответ ресурсами с совпадающим тегом сущности. Так выбирается конкретное представление, а не проверяется кэш (для проверки кэша используется If-None-Match).

Для методов, изменяющих состояние, таких как PUT и DELETE, заголовок If-Match предотвращает проблему потерянного обновления. Когда два клиента получают один и тот же ресурс, независимо изменяют свои копии и пытаются записать их обратно, заголовок If-Match гарантирует, что успешной будет только первая запись. Вторая завершится ошибкой 412 Precondition Failed, потому что после первой записи ETag изменился.

Этот приём известен как оптимистичное управление параллелизмом. Клиент читает ресурс и его ETag, вносит изменения локально и отправляет обновление с If-Match, равным исходному ETag. Сервер убеждается, что за это время ресурс не изменился, и только затем применяет обновление.

Заголовок If-Match выполняет исключительно строгое сравнение. Слабые теги сущности (с префиксом W/) не совпадают, даже если непрозрачное значение идентично. Такое строгое поведение обеспечивает побайтовую эквивалентность ресурса.

Список тегов сущности

Одно или несколько значений ETag, заключённых в двойные кавычки и разделённых запятыми. Сервер сверяет каждое значение с текущим тегом сущности ресурса.

Подстановочный знак (*)

Звёздочка * соответствует любому текущему представлению ресурса. Эта форма срабатывает, пока целевой ресурс существует, независимо от значения его тега сущности. Значение * обычно применяют с PUT, чтобы не создать новый ресурс, если по целевому URI он уже есть.

Пример

Клиент отправляет запрос PUT для обновления ресурса. Заголовок If-Match несёт ETag из исходного ответа на GET. Сервер применяет обновление только тогда, когда ETag всё ещё совпадает.

PUT /document/42 HTTP/1.1
Host: api.example.re
Content-Type: application/json
If-Match: "a1b2c3d4"

{"title": "Updated Document"}

Если ресурс был изменён другим клиентом, ETag больше не совпадает. Сервер отвечает 412 Precondition Failed и отклоняет обновление.

HTTP/1.1 412 Precondition Failed
Content-Type: application/json
ETag: "e5f6g7h8"

Несколько тегов сущности перечисляются через запятую. Условие выполняется, когда любое из перечисленных значений совпадает с текущим ETag ресурса.

If-Match: "a1b2c3d4", "x9y8z7w6"

Форма с подстановочным знаком срабатывает, когда ресурс существует. Это не даёт запросу PUT случайно создать новый ресурс.

If-Match: *