Почему ответы на запросы 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
,