If-Match: не перезаписать чужое изменение
Условный запрос помогает сохранить данные только для той версии ресурса, которую пользователь действительно редактировал. Это один из способов обнаружить конфликт параллельных изменений.
Назначение
Условный запрос помогает сохранить данные только для той версии ресурса, которую пользователь действительно редактировал. Это один из способов обнаружить конфликт параллельных изменений.
Как это работает
Клиент получает ETag версии и передаёт его в If-Match при изменении. Сервер сравнивает сильные валидаторы и выполняет операцию только при совпадении. Схема ниже иллюстрирует HTTP-обмен и не является готовым обработчиком.
Пример
PUT /api/lesson/7 HTTP/1.1
If-Match: "lesson-v3"
Content-Type: application/json
{"title":"Updated lesson"}
HTTP/1.1 412 Precondition Failed
Что должно получиться
Ответ 412 сообщает, что указанное предусловие не выполнено. Пользовательскому интерфейсу следует предложить получить актуальную версию и разрешить конфликт, а не молча повторять запись поверх новых данных.
Граница применения и частая ошибка
If-Match не заменяет авторизацию, проверку тела и атомарность серверной операции. Слабые ETag с W/ не подходят для сильного сравнения. Простое получение версии и отдельная запись без атомарной проверки всё ещё допускают гонку.
Самостоятельная проверка
На изолированном тестовом API откройте одну запись в двух клиентах. Сохраните первый вариант, затем попробуйте второй со старым ETag. Проверьте, что отказ не изменил данные и интерфейс не показал ложное сообщение об успехе.