为什么不同的Etags用于同一资源的不同表示?

时间:2011-04-22 02:03:10

标签: rest etag

我理解使用etags进行乐观并发控制(例如在RESTful样式的体系结构中),并且我已经读过etags对于同一资源的不同表示应该是不同的。那是为什么?

最终,我们是否有兴趣了解资源是否已更改,以便我们可以处理并发修改?我很难想象资源的表示会在资源本身没有变化的情况下发生变化,所以我显然缺少一些基本的理解。

2 个答案:

答案 0 :(得分:9)

好问题,我认为这是一个有争议的问题。

我认为大多数人会说ETag不仅代表资源版本,还代表内容类型。这对于根据内容类型,语言等缓存响应是有意义的。

查看以下链接:

答案 1 :(得分:4)

当您列出事实或阅读HTTP& HTTPbis规范时,这不是一个争论的问题。

ETag是一种缓存和并发控制的方法。 弱ETag只是穷人缓存的一种手段。

在缓存方面(GET) - uri + content-type + etag可以通过不响应有效负载来帮助您节省带宽,但只有304状态代码。

在并发控制(POST; PUT; PATCH)方面 - 基于URI +内容类型+比特精确响应有效载荷计算ETag是浮躁的。为什么呢?

  • 如果基于整个对象计算ETag,则响应有效负载的超集(即,您的有效负载给出+ b,但对象实际上是+ b + c),然后执行PATCH例如将结束失败,因为ETag改变了...你刷新..你得到相同的数据,但不同的ETag ...你用新的ETag重试PATCH,现在它的工作原理。的 FAIL
  • 如果您根据有效负载的子集计算ETag,那么您实际上是强迫用户无法控制不安全呼叫的条件而根本没有任何透明度。即使与该ETag关联的数据已更改,PATCH也会成功,这显然不是HTTP请求的预期方式。的 FAIL

条件请求应该使用类似于“假定我的世界观仍然相同,然后执行请求的语义”来处理。否则将失败。我对世界的看法来自过去的回应(URI +标题+有效载荷)。