2011-04-22 39 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 +標頭+有效載荷)構成的。

相關問題