http 協議 通用資訊頭 Transfer-Encoding: chunked
client 向server傳送請求與 server向client向返回響應,在訊息頭當中均可以包含
Transfer-Encoding: chunked
作用:描述訊息實體的長度
有什麼用:
訊息的實體長度在傳送之前不方便確定的時候,可以使用此引數,如果方便確定直接使用
Content-Length:就可以了,
怎麼樣使用:
Transfer-Encoding:chunked 針對於實體的訊息格式
第i塊大小\r\nxxxxxxxx塊的資料\r\n第i+1塊大小\r\nxxxxxx塊的資料\r\n0\r\n\r\n
注意:
1. 塊的大小描述所佔用的位元組個數是不固定的,可以是一個位元組,二個位元組或多個位元組。
【參考】
HTTP chunked編碼資料流解析演算法
http://stackoverflow.com/questions/15115069/http-chunked-transfer/** Send some data to the server, HTTP/1.1 chunked style. */ public void send(String chunkData) throws IOException { byte[] chunkBytes = chunkData.getBytes(ENCODING); String hexChunkLength = Integer.toHexString(chunkBytes.length); StringBuffer outputBuffer = new StringBuffer(); outputBuffer.append(hexChunkLength); outputBuffer.append(DELIMITER); outputBuffer.append(chunkData); outputBuffer.append(DELIMITER); byte[] outputBytes = outputBuffer.toString().getBytes(ENCODING); outputStream.write(outputBytes); outputStream.flush(); outputBuffer = new StringBuffer(); outputBuffer.append("0"); outputBuffer.append(DELIMITER); outputBuffer.append(DELIMITER); outputBytes = outputBuffer.toString().getBytes(ENCODING); outputStream.write(outputBytes); outputStream.flush(); }
在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結尾。