1. 程式人生 > >http 協議 通用資訊頭 Transfer-Encoding: chunked

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結尾。