Http 響應頭中Transfer-Encoding: chunked

在http 的響應頭中有時會見到這樣的字段:Transfer-Encoding: chunked,這是一種分段傳輸數據的方式。如果對此格式不瞭解,直接將響應體以某一編碼轉換成字符串,就會出現亂碼。result = new String(data, "utf-8");data爲接受的數據。

分塊傳輸編碼Chunked transfer encoding)是超文本傳輸協議(HTTP)中的一種數據傳輸機制,允許HTTP
頁服務器
發送給客戶端應用( 通常是網頁瀏覽器)的數據可以分成多個部分。分塊傳輸編碼只在HTTP協議1.1版本(HTTP/1.1)中提供。

通常,HTTP應答消息中發送的數據是整個發送的,Content-Length消息頭字段表示數據的長度。數據的長度很重要,因爲客戶端需要知道哪裏是應答消息的結束,以及後續應答消息的開始。然而,使用分塊傳輸編碼,數據分解成一系列數據塊,並以一個或多個塊發送,這樣服務器可以發送數據而不需要預先知道發送內容的總大小。通常數據塊的大小是一致的,但也不總是這種情況。

格式

如果一個HTTP消息(請求消息或應答消息)的Transfer-Encoding消息頭的值爲chunked,那麼,消息體由數量未定的塊組成,並以最後一個大小爲0的塊爲結束。

每一個非空的塊都以該塊包含數據的字節數(字節數以十六進制表示)開始,跟隨一個CRLF (回車換行),然後是數據本身,最後塊CRLF結束。在一些實現中,塊大小和CRLF之間填充有白空格(0x20)。

最後一塊是單行,由塊大小(0),一些可選的填充白空格,以及CRLF。最後一塊不再包含任何數據,但是可以發送可選的尾部,包括消息頭字段。

消息最後以CRLF結尾。

例子


編碼的應答

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

25
This is the data in the first chunk

1C
and this is the second one

3
con

8
sequence

0

編碼應答的解釋

前兩個塊的數據中包含有顯式的\r\n字符。

"This is the data in the first chunk\r\n"      (37 字符 => 十六進制: 0x25)
"and this is the second one\r\n"               (28 字符 => 十六進制: 0x1C)
"con"                                          (3  字符 => 十六進制: 0x03)
"sequence"                                     (8  字符 => 十六進制: 0x08)

應答需要以0長度的塊( "0\r\n\r\n".)結束。

解碼的數據

This is the data in the first chunk
and this is the second one
consequence

參見:http://zh.wikipedia.org/wiki/%E5%88%86%E5%9D%97%E4%BC%A0%E8%BE%93%E7%BC%96%E7%A0%81


發佈了64 篇原創文章 · 獲贊 25 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章