HTTP协议的Transfer-Encoding头部用于指定传输时数据的编码方式。下面详细讲解一下这个头部的取值和含义:
头部取值
chunked
指定使用分块编码方式传输。在传输响应体时,服务器将响应体划分为多个大小不同的块,每个块都会以单独的指示块长度的16进制数码开头,并使用CRLF作为行尾标示。最后以一个块长度为0的标示块结束整个响应体的传输。
compress
指定使用压缩编码方式传输,编码方式为Unix下压缩工具compress格式。该编码方式较为古老,已经不太使用。
deflate
指定使用Deflate算法压缩后传输数据。Deflate是一种通用的压缩算法,由于压缩率高,所以该编码方式是HTTP传输中较为常用的一种。
gzip
指定使用gzip格式压缩后传输数据,是HTTP传输中最广泛使用的一种压缩方式,因为具有压缩率高和可逆性好的特点。
identity
指定不对数据进行编码,即使用标准的ASCII字符集进行转换和传输。
示例说明
下面通过两个示例说明Transfer-Encoding头部的使用方法。
示例 1:使用chunked传输
假设服务器返回的响应体内容如下:
<html>
<body>
<h1>Hello World</h1>
</body>
</html>
如果服务器想要使用chunked方式进行传输,那么响应头部的Transfer-Encoding字段就需要设置为chunked,表示响应体使用分块编码进行传输。
HTTP/1.1 200 OK
Content-Type: text/html
Transfer-Encoding: chunked
25
<html>
<body>
<h1>Hello World</h1>
</body>
</html>
0
上面的响应头部中,25表示第一个块的内容长度(也就是后面的html代码),之后的CRLF代表结束符,接下来是第一个块的内容,最后一个块的长度为0,标示传输结束。
示例 2:使用gzip压缩传输
假设服务器返回的响应体内容如下:
<html>
<body>
<h1>Hello World</h1>
</body>
</html>
如果服务器想要使用gzip压缩方式传输,那么响应头部的Transfer-Encoding字段就需要设置为gzip,表示响应体已经使用gzip算法进行压缩。
HTTP/1.1 200 OK
Content-Type: text/html
Content-Encoding: gzip
<gzip compressed data>
上面的响应头部中,Content-Encoding字段设置为gzip代表已经使用gzip算法进行压缩,真正的压缩内容则存储在响应体中。客户端在接收到响应体时,需要先对响应体进行解压缩才能获取到真正的HTML代码。