http請求 HTTP/204和HTTP/206響應

上次我們講了HTTP/304響應,今天我們繼續討論另外三種可能讓Fiddler用戶感到困惑的請求或響應類型.

下面的截圖中有三條Web會話,每一條都返回了不同的狀態碼,但都在HTTP/2xx範圍內:

image

HEAD請求方法

第一個請求返回了HTTP/200,但你應該注意到了,服務器並沒有返回響應體.如果你在Inspectors選項卡中查看一下,就會發現客戶端使用的是HEAD請求方法.HEAD方法允許客戶端僅向服務器請求某個資源的響應頭,而不要真正的下載該資源本身.服務器返回的響應頭應該和客戶端使用GET方法請求該資源時返回的請求頭相同,比起GET方法,只是省略了響應體.

image

從上圖中可以看出,如果客戶端使用GET而不是HEAD方法請求該資源,服務器就應該會返回6623字節大小的響應體.還可以看出,該資源的類型爲text/html以及它的編碼爲UTF-8.客戶端可以使用HEAD請求來收集相關信息以確定如何操作該資源.例如,在IE中,如果一個OBJECT元素缺少TYPE參數,瀏覽器就會發送一個HEAD請求,目標URL爲這個OBJECT元素的SRC屬性指定的URL.然後瀏覽器就能夠根據響應中的Content-Type頭知道這是哪種類型的OBJECT.

HTTP/204響應

會話列表中的第二條會話返回了HTTP/204響應.從Content-Length響應頭可以看出,該響應沒有響應體,狀態碼描述爲“No Content”:

image

你也許會有疑問:“返回一個沒有響應體的HTTP/200響應不行嗎?”

如果沒有響應體,則在大多數場景下,這兩種響應碼完全等效,但有一種情況下,HTTP/204響應會讓瀏覽器有不同的表現.這種情況就是當用戶在瀏覽器窗口window或者frame/iframe框架中導航的時候.

  • 如果導航到的URL返回了一個沒有響應體的HTTP/200響應,則頁面將會顯示一個空白文檔(就是一片白色).頁面的URL地址也會變成新指定的URL.

  • 如果服務器返回的是一個HTTP/204響應,當前頁面不會有任何變化,就好像根本沒有進行導航操作一樣.頁面的URL地址也保持不變.

HTTP/205響應碼很少見,它類似於HTTP/204,除了頁面保留在當前文檔不變以外,多了一步操作,就是要清空當前文檔內所有表單控件的內容.

HTTP/206響應

最後一條會話返回了HTTP/206 “Partial Content”響應.這種響應是在客戶端表明自己只需要目標URL上的部分資源的時候返回的.這種情況經常發生在客戶端繼續請求一個未完成的下載的時候(通常是當客戶端加載一個體積較大的嵌入文件,比如視屏或PDF文件),或者是客戶端嘗試實現帶寬遏流的時候.

你可以通過Range請求頭辨認出一個部分內容請求.該請求頭表明了客戶端需要請求資源的哪一部分:

image

在上圖的請求中,客戶端告訴服務器,它需要該視屏文件中從172,032到13,325,503字節範圍內的數據.

在大多數情況下,客戶端還會發送一些條件請求頭,讓服務器來辨別該返回哪個版本的資源.在上圖的請求中,客戶端把它在上次接收該資源的0到172032字節部分請求中服務器返回的ETag響應頭作爲了本次請求的If-Match請求頭髮送了出去,同樣還把上次響應中的Last-Modified響應頭用If-Unmodified-Since請求頭髮送了出去.

如果服務器發現該資源的版本與客戶端所請求的版本不匹配,則會返回一個HTTP/412 Precondition Failed響應.如果客戶端使用If-Range請求頭而不是If-Match發送了上次收到的ETag響應頭的值,且服務器發現客戶端請求的版本與當前資源的版本不匹配,則服務器會返回整個資源數據.如果客戶端需要完整的資源數據,使用If-Range可以減少一個網絡請求.

服務器的Content-Range響應頭表明了返回的是文件的哪一部分,Content-Length響應頭表明了該部分文件的大小:
image

你也許注意到了Accept-Ranges響應頭,服務器發送這個頭的目的是讓客戶端知道服務器接受以字節爲單位的部分內容請求.

如果你在Fiddler中看到了一個HTTP/206響應,但你需要的是一個完整的文件(比如你想保存一個完整的視屏文件),你可以選中該會話按下U鍵,或者按住Ctrl鍵點擊工具欄中的Replay按鈕,執行無條件請求.


原文:http://www.cnblogs.com/ziyunfei/archive/2012/11/17/2775421.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章