在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