2011-04-22 38 views
14

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

最终我们不知道资源是否发生了变化,因此我们可以处理并发修改?我很难想象资源的表示会在资源本身发生变化的情况下发生变化,所以我显然错过了一些基本的理解。

回答

4

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

ETag是缓存和并发控制的一种手段。 012gt弱ETags只是穷人缓存的手段。在缓存(GET)方面--uri + content-type + etag可以帮助您节省带宽,因为不会对有效负载做出响应,只需要304状态码。

就并发控制(POST; PUT; PATCH)而言 - 根据URI +内容类型+位精确响应负载计算ETag是浮躁的。为什么?

  • 如果计算基于整个对象的ETag的,响应有效载荷的超集(即您的有效载荷给出A + B,但对象实际上是A + B + C),然后做了一个补丁实例将最终失败,因为ETag改变了...你刷新..你得到的数据相同,但是不同的ETag ...你用新的ETag重试PATCH,现在它工作。 失败
  • 如果您根据有效负载的子集计算ETag,实际上您迫使用户无法控制不安全呼叫的条件,而没有任何透明度。即使与该ETag相关的数据发生了变化,PATCH也会成功,这显然不是HTTP请求的意图。 FAIL

条件要求应与语义相似的处理,以“鉴于我对世界的看法仍然是相同的,则执行该请求。否则失败”。我对世界的看法是由过去的回应(URI +标头+有效载荷)构成的。

相关问题