Разработчик приложения должен проверить E-Tag и предоставить эту логику. Это не волшебство, что веб-сервер делает для вас, потому что он знает только, как рассчитать E-Tag
заголовки для статического контента. Итак, давайте возьмем ваш сценарий выше и разберем, как должно происходить взаимодействие.
GET /projects/1
Сервер получает запрос, определяет E-Tag для этой версии записи, возвращая ее с фактическим содержимым.
200 - OK
E-Tag: "412"
Content-Type: application/json
{modified: false}
Поскольку у клиента теперь есть значение E-Tag, оно может включать это в PUT
запрос:
PUT /projects/1
If-Match: "412"
Content-Type: application/json
{modified: true}
На этом этапе ваше приложение должно сделать следующее:
- Убедитесь, что E-Tag по-прежнему правильный: "412" == "412"?
- Если это так, сделайте обновление и рассчитайте новый E-Tag
Отправьте ответ об успехе.
204 No Content
E-Tag: "543"
Если другой запрос приходит и пытается выполнить PUT
аналогичный запрос выше, во второй раз, когда ваш серверный код оценивает его, вы обязаны предоставить сообщение об ошибке.
- Убедитесь, что E-Tag по-прежнему правильный: "412"! = "543"
В случае ошибки отправьте ответ об ошибке.
412 Precondition Failed
Это код, который вы действительно должны написать. Фактически, E-Tag может быть любым текстом (в пределах, определенных в спецификации HTTP). Это не должно быть число. Это также может быть хеш-значением.