Почему ответы на запросы PUT НЕ ДОЛЖНЫ предоставлять ETag?

Из протокола передачи гипертекста (HTTP/1.1): семантика и контент:

Исходный сервер НЕ ДОЛЖЕН отправлять поле заголовка валидатора ( раздел 7.2), такое как ETag или же Last-Modified поле, в успешном ответе на PUT если только данные представления запроса не были сохранены без какого-либо преобразования, примененного к телу (т. е. новые данные представления ресурса идентичны данным представления, полученным в запросе PUT), и значение поля валидатора отражает новое представление. Это требование позволяет агенту пользователя знать, когда тело представления в памяти остается актуальным в результате PUT Таким образом, нет необходимости в повторном извлечении с исходного сервера и что новые средства проверки, полученные в ответе, могут использоваться для будущих условных запросов, чтобы предотвратить случайные перезаписи ( раздел 5.2).

Я не могу полностью понять этот раздел... жирные предложения, кажется, противоречат самим себе, не так ли?

Обратите внимание, что PUT это единственный глагол, имеющий раздел, касающийся заголовков валидатора (см. GET / POST / DELETE / PATCH).

1 ответ

Решение

Ключевым моментом является то, что сервер может или не может изменить представление перед его сохранением. Из раздела, на который вы ссылаетесь:

Успешный PUT данного представления предполагает, что последующее GET на том же целевом ресурсе приведет к отправке эквивалентного представления в 200 (OK) ответ. Однако нет никакой гарантии, что такое изменение состояния будет наблюдаемым, поскольку целевой объект... может быть подвергнут динамической обработке исходным сервером.

Следовательно, стандарт использует наличие или отсутствие заголовка валидатора, чтобы указать агенту пользователя, было ли изменено представление.

Если представление не было изменено, то сервер может вернуть поле заголовка валидатора, и пользовательский агент может использовать это для условной проверки только что отправленного представления.

Если представление было изменено, то представление агента пользователя по определению недопустимо. Поэтому заголовок валидатора не возвращается, и пользовательский агент должен будет сделать безусловное GET,

Другие вопросы по тегам