为什么对PUT请求的响应必须不提供ETag?

时间:2017-02-15 10:21:54

标签: rest http put etag rfc

来自Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content

  

原始服务器不得发送验证器标头字段Section 7.2),例如ETagLast-Modified字段,成功回复{ {1}}除非保存请求的表示数据而没有对主体应用任何变换(即,资源的新表示数据与在PUT请求中接收的表示数据相同),并且验证器字段值反映新表示。此要求允许用户代理知道它在内存中的表示主体何时由于PUT而保持当前状态,因此不需要从原始服务器再次检索,并且新的验证器(s)在回复中收到的信息可用于未来的条件请求,以防止意外覆盖(Section 5.2)。

我无法完全理解这一节...... 粗体句似乎与自己相矛盾,不是吗?

请注意,PUT是唯一包含有关验证程序标头的部分的动词(请参阅GET / POST / DELETE / PATCH)。

1 个答案:

答案 0 :(得分:4)

关键是服务器可能会或可能不会在存储之前更改表示。从您链接到的部分:

  

给定表示的成功PUT表明同一目标资源上的后续GET将导致在200 (OK)响应中发送等效表示。但是,不能保证这种状态变化是可观察的,因为目标......可能会受到原始服务器的动态处理。

因此,该标准使用验证器标头的存在或不存在来向用户代理指示该表示是否已被更改。

如果表示没有被更改,那么服务器可以返回验证器头字段,用户代理可以使用它来有条件地验证它刚刚发送的表示。

如果表示已被更改,则根据定义,用户代理的表示无效。因此,不返回验证器头,并且用户代理必须执行无条件GET