1. 程式人生 > >你應該知道的HTTP頭------ETag

你應該知道的HTTP頭------ETag

在HTTP1.1規範中,新增了一個HTTP頭資訊:ETag。對Web開發者來說,它是一個非常重要的資訊。它是用作快取使

用的兩個主要的頭資訊之一 (另一個是Expires)。除此之外,在REST架構中,它還可以用於控制併發操作(上節中已經大

致介紹AtomPub中控制併發的流程)。那麼ETag是什麼?它又幾種型別?強ETag與弱ETag之間有什麼區別。?如何計算

ETag值?它與Last-Modified頭資訊在使用上有什麼區別?本節主要圍繞這幾個方面敘述一下自己的理解。


目錄:

  1. 什麼是ETag?
  2. 計算ETag值
  3. ETag的型別以及他們之間的區別
  4. ETag與Last-Modified頭資訊用途上的區別

什麼是ETag? 

ETag:是實體標籤(Entity Tag)的縮寫。ETag一般不以明文形式相應給客戶端。在資源的各個生命週期中,它都具有不

值,用於標識出資源的狀態。當資源發生變更時,如果其頭資訊中一個或者多個發生變化,或者訊息實體發生變化

,那ETag也隨之發生化。

ETag值的變更說明資源狀態已經被修改。往往可以通過時間戳就可以便宜的得到ETag頭資訊。在服務端中如果發回給

消費者的相應一開始起就由ETag控制,那麼可以確保更細粒度的ETag升級完全由服務來進行控制。服務計算ETag值,

並在相應客戶端請求時將它返回給客戶端。

計算ETag值

在HTTP1.1協議中並沒有規範如何計算ETag。ETag值可以是唯一標識資源的任何東西,如持久化儲存中的某個資源關聯

的版本、一個或者多個檔案屬性,實體頭資訊和校驗值、(CheckSum),也可以計算實體資訊的雜湊值。有時候,為了計

算一個ETag值可能有比較大的代價,此時可以採用生成唯一值等方式(如常見的GUID)。無論怎樣,服務都應該儘可能的

將ETag值返回給客戶端。客戶端不用關心ETag值如何產生,只要服務在資源狀態發生變更的情況下將ETag值傳送給它就行

。下圖為MSDN中,OutgoingResponse類中設定ETag值的截圖:

2011-12-24_105957

從上圖可以看出,在REST架構下,ETag值可以通過Guid、整數、長整形、字串四種類型的引數傳入SetETag方法,

WCF服務發回給客戶端的HTTP響應頭中就包含了ETag值。另外OutgoingResponse類也有字串屬性:ETag直接給

它賦值也能在HTTP響應頭中寫入ETag值。

如下所示為使用檔案屬性計算ETag:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class ETag : IHeader { private string Value; public ETag(string value) { Value = value; WebOperationContext.Current.OutgoingResponse.ETag } #region IHeader 成員 public void AddHTTPHeader(ResponseContext context) { context.WriteHttpHeader(Value); } #endregion }
1 <font size="2" face="微軟雅黑">獲取ETag:</font>
1 ETag eTag = new ETag(fileInfo.Name+fileInfo.LastWriteTimeUtc.ToString())

計算ETag值時,需要考慮兩個問題:計算與儲存。如果一個ETag值只需要很小的代價以及佔用很低的儲存空間,那麼

我們以在每次需要傳送給客戶端ETag值值的時候計算一遍就行行了。相反的,我們需要將之前就已經計算並存儲好

的ETag值傳送給客戶端。之前說:將時間戳作為字串作為一種廉價的方式來獲取ETag值。對於不是經常變化的訊息,

它是一種足夠好的方案。注意:如果將時間戳做為ETag值,通常不應該用Last-Modified的值。由於HTTP機制中,所

以當我們在通過服務校驗資源狀態時,客戶端不需要進行相應的改動。計算ETag值開銷最大的一般是計算採用雜湊演算法

獲取資源的表述值。可以只計算資源的雜湊值,也可以將頭資訊和頭資訊的值也包含進去。如果包含頭資訊,那麼注意

不要包含計算機標識的頭資訊。同樣也應該避免包含Expires、Cache-Control和Vary頭資訊。注意:在通過雜湊演算法

計算ETag值時,先要組裝資源的表述。若組裝也比較耗時,可以採用生成GUID的方式。優化ETag值的獲取。

ETag的型別以及他們之間的區別

ETag有兩種型別＀現將�ETag(strong ETag)與弱ETag(weak ETag)。

強ETag表示形式:"22FAA065-2664-4197-9C5E-C92EA03D0A16"。

弱ETag表現形式:w/"22FAA065-2664-4197-9C5E-C92EA03D0A16"。

強、弱ETag型別的出現與Apache務器計算ETag的方式有關。Apache預設通過FileEtag中FileEtag INode Mtime Siz

e的配置自動生成ETag(當然也可以通過使用者自定義的方式)。假設服務端的資源頻繁被修改(如1秒內修改了N次),此時

如果有使用者將Apache的配置改為MTime,由於MTime只能精確到秒,那麼就可以避免強ETag在1秒內的ETag總是不同而

頻繁重新整理Cache(如果資源在秒級經常被修改,也可以通過Last-Modified來解決)。

ETag與Last-Modified頭資訊用途上的區別

按照HTTP標準,Last-Modified只能精確到秒級。ETag的出現可以很好的解決這個問題。在用途上,ETag常與

If-None-Match或者If-Match一起,由客戶端通過HTTP頭資訊(包括ETag值)傳送給服務端處理。ETag使用如下:

Get /Order/36 Http1.1

If-Match:"22FAA065-2664-4197-9C5E-C92EA03D0A16"

或If-None-Match:"22FAA065-2664-4197-9C5E-C92EA03D0A16"

Last-Modified常與If-Modified-Since一起由客戶端將Last-Modified值包括在HTTP頭資訊中發給服務端進行處理。

其使用如下:

If-Modified-Since:Sat,24 Dec 2011 11:55:36 GMT

相關推薦

應該知道HTTP------ETag

在HTTP1.1規範中,新增了一個HTTP頭資訊:ETag。對Web開發者來說,它是一個非常重要的資訊。它是用作快取使 用的兩個主要的頭資訊之一 (另一個是Expires)。除此之外,在REST架構中,它還可以用於控制併發操作(上節中已經大 致介紹AtomPub中控制併發的流程)。那麼ETag是什麼?它又

關於HTTP協議應該知道這些

概念 HTTP協議(HyperText Transfer Protocol, 超文字傳輸協議)是因特網上應用最為廣泛的一種網路協議,所有的www檔案都必須遵循這個標準。 HTTP基於TCP/IP通訊協議來傳遞資料(包括:HTML,檔案,圖片,查詢結果等)。 協議

應該知道HTTP請求返回狀態碼和提示資訊

整理概括如下: 1xx – 資訊提示 這些狀態程式碼表示臨時的響應。客戶端在收到常規響應之前,應準備接收一個或多個 1xx 響應。 2xx – 成功 這類狀態程式碼表明伺服器成功地接受了客戶端請求。 3xx – 重定向 客戶端瀏覽器必須採取更多操作來實現請求。例如,瀏覽器

色彩力量!21款應該知道的優秀品牌設計

data- 一個 蘋果 歐洲 alt img 一次 rpi width 色彩理論是設計的核心,也是常常被忽略的領域。色彩本身就與情感相連。一般而言,紅色、橙色和黃色這種暖色充滿活力。令人振奮。而藍色、綠色這種冷色調則顯得更加沈穩內斂。這一點非常重要。所以,當我們談及

應該知道的 5 個 Docker 工具

.so 使用 開發環境 /var/ 聲明 use 中大 mount host 你可以在網上找到大量炫酷的Docker 工具,並且大部分是開源的,可以通過Github訪問。在過去的兩年裏,我開始在開發項目中大量使用Docker。當你開始使用Docker,你會發現它比你想象的還

第一次使用Android Studio時應該知道的一切配置

出現 jpg rcu true 導入 職位 文章 加載 什麽 【聲明】 歡迎轉載,但請保留文章原始出處→_→ 生命壹號:http://www.cnblogs.com/smyhvae/ 文章來源:http://www.cnblogs.com/smyhvae/p/43909

第一次使用Android Studio時應該知道的一切配置(二):新建一個屬於自己的工程並安裝Genymotion模擬器

人性 pro net 參考 json irb 一個地方 vid 調試 【聲明】 歡迎轉載,但請保留文章原始出處→_→ 生命壹號:http://www.cnblogs.com/smyhvae/ 文章來源:http://www.cnblogs.com/smyhvae/p/439

應該知道的網頁設計中的規則和禁忌

以下內容由Mockplus團隊翻譯整理,僅供學習交流,Mockplus是更快更簡單的原型設計工具。 網頁設計是一個棘手的話題。當你創建網站時你需要考慮很多事情。為了簡化這個任務,我這裏準備了一個列表,每個網頁設計師在設計網頁時都應該考慮這些註意事項。好消息是,這都是一些簡單的設計原則

Android中關於View滑動的實現應該知道

nan ida gif 當前位置 距離 保存 改變 post 控件 滑動作為Android中最基礎的特效之一,使用場景非常廣泛。實現的方式也有多種,理解各種滑動的實現方式。清楚在開發中根據自己的實際需求,選擇合理的實現方案。這篇文章從:scrollTo()/scrollBy

關於 Token,應該知道的十件事

敏感信息 you load 冒充 tro hex 服務器 xhr cors 轉自:http://ju.outofmemory.cn/entry/134189 原文是一篇很好的講述 Token 在 Web 應用中使用的文章,而這是我和 Special 合作翻譯的譯文。 1.

做網站SEO優化,這些網絡引流方法,應該知道

尋求 可能 垃圾郵件 百度搜 如果 什麽 網站鏈接 很快 建立 對於網站SEO優化來說,網站流量的重要性不言而喻!國內的站長平臺工具通過用網站流量來衡量一個網站的權重,當你的網站流量很高的時候,同時會影響你網站的權重,進而影響你網站SEO優化排名。所以說流量對於一個網站的意

華為認證那些應該知道的事情

含金量 network 技術人才 設計工程師 技術 soc 入職 信息 網絡架構 華為認證主要分為三個等級:HCNA、HCNP以及HCIE:一、 華為認證數據通信工程師-HCDA(Huawei Certified Network Associate) 認證前提:無適

第一次使用Android Studio時應該知道的一切配置(三):gradle項目構建

gen 官方 配置文件 conf 什麽 學習 package ack 處的 ?【聲明】 歡迎轉載,但請保留文章原始出處→_→ 生命壹號:http://www.cnblogs.com/smyhvae/ 文章來源:http://www.cnblogs.com/smyhvae

應該知道的JAVA面試題

適配器模式 初始 現在 訂票 http 一致性 用戶 策略模式 參數 經常面試一些候選人,整理了下我面試使用的題目,陸陸續續整理出來的題目很多,所以每次會抽一部分來問。答案會在後面的文章中逐漸發布出來。 基礎題目 Java線程的狀態 進程和線程的區別,進程間如何通訊,

使用“數據驅動測試”之前應該知道的(二)

clas back args ase 沒有 告訴 ... last 數據文件 我們繼續上期的話題,單純讀取數據文件來做自動化是有諸多問題的。那麽我們借助單元測試框架來做自動化就爽多了,因為它解決了測試中的幾問題。 如何定義一條測試用例,我們知道編程的世界裏並沒“用例”的概

Select 使用不當引發的core,應該知道

retcode 代碼 async fetch sse com 基礎 -a cnblogs 排查一個死機問題,搞了好幾天時間,最終確定原因;最終確定問題原因,在此分享一下; 第一步:常規根據core文件查看棧信息,gdb –c core xxxx 如下rip不正確,指令地址錯

sping IOC和DI 應該知道事情1

spa oschina rabl logs abstract pri ati lap 好的 springIOC和spring DI作為spring core的核心思想,有必要學習下才能更好的使用spring =================================

Python:應該知道這些

服務 數學 語言特點 這樣的 數學庫 郵件 說明 商業 圖形顯示 1. Python的出生 1989年  Guido van Rossum開始編寫Python語言編輯器(龜叔為了打發無聊的聖誕節) 1991年  第一個Python編譯器誕生(正式誕生) 1994年  Pyt

應該知道的react router 4(三)

req static mat 測試 lin -name trie span sta   上一篇我們說到了路由組件的嵌套。想必你已經運用自如了。那麽,這一次我們來聊一聊4.X中Router的變更。 在3.X中我們若使用路由的模式,可通過在Router上配置history的值即

應該知道的react router 4(五)

parent 常用 training api 應該 urn 包裝 外部 prop   或許,你覺得我麻煩,明明一篇文章可以搞定的內容,非要寫幾篇。是不是正在吐槽我?沒關系,我的目的達到了。手動傲嬌( ̄? ̄) 然後,我們就要來聊一聊withRouter了。 我們都知道,當我在