本文着重针对http在传输数据时的几种封装方式进行描述。
1. Content-Type(描述body内容类型以及字符编码)
HTTP的Content-Type用于定义数据传输的媒体类型(MIME类型),主要分为以下几类:
(一)、基础文本类型
text/plain
纯文本格式,无任何格式标记,常用于日志或简单文本传输。示例:
Content-Type: text/plain; charset=utf-8
text/html
HTML文档格式,用于网页渲染。示例:
Content-Type: text/html; charset=utf-8
text/xml
XML数据格式,适用于结构化文本传输。示例:Content-Type: text/xml; charset=utf-8
(二)、表单数据类型
application/x-www-form-urlencoded
表单默认编码格式,数据以key=value形式拼接(如name=John&age=30)。适用于普通表单提交。示例:
Content-Type: application/x-www-form-urlencoded
multipart/form-data
支持文件上传的编码格式,数据按字段分割并通过boundary标识。示例:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123
(三)、结构化数据格式
application/json
JSON数据格式,广泛用于API交互。示例:Content-Type: application/json; charset=utf-8
application/xml
XML数据格式,适用于复杂结构化数据传输。示例:Content-Type: application/xml
application/javascript
JavaScript代码传输,常用于动态脚本加载。示例:Content-Type: application/javascript
(四)、二进制文件类型
application/octet-stream
通用二进制流格式,适用于未知类型的文件下载。示例:Content-Type: application/octet-stream
image/*(如image/jpeg、image/png)
图片文件格式,*表示具体图片类型(如JPEG、PNG)。示例:Content-Type: image/jpeg
application/pdf
PDF文档格式,用于文档传输。示例:Content-Type: application/pdf
(五)、其他常见类型
application/zip
压缩文件格式,适用于打包文件传输。示例:Content-Type: application/zip
audio/*(如audio/mpeg)
音频文件格式,如MP3、WAV等。示例:Content-Type: audio/mpeg
video/*(如video/mp4)
视频文件格式,如MP4、AVI等。示例:Content-Type: video/mp4
(六)、MIME类型结构
MIME类型由主类型(media type)和子类型(subtype)组成,格式为:
Content-Type: <主类型>/<子类型>; 参数(如charset、boundary等)
例如:text/html; charset=utf-8。
关键使用场景
API交互:优先使用application/json。
文件上传:必须使用multipart/form-data。
网页渲染:需指定text/html。
纯文本传输:采用text/plain。
2.Content-Encoding(描述整个body内容的编码)
请求方向服务端描述能够接收的编码算法
Accept-Encoding: gzip, deflate, br
服务端向请求端描述实际使用的编码算法
Content-Encoding: gzip
当采用具体的压缩算法后,服务器端会对整体需要返回的数据进行对应算法的压缩,在Content-Length中描述的长度,将是压缩后数据的长度。
客户端收取到数据后,需要使用对应算法进行解压缩,得到真实的数据。
3.Transfer-Encoding(数据传输发送和压缩算法)
Transfer-Encoding 是 HTTP 协议中用于指定传输编码方式的响应头字段,其枚举值包括以下几种:
chunked
表示数据以分块形式传输,适用于无法预先确定响应体长度的场景(如动态生成内容或大文件传输)。
ompress
使用 Lempel-Ziv-Welch (LZW) 算法进行压缩传输,但目前主流浏览器已不再支持该格式。
deflate
使用 zlib 结构和 deflate 压缩算法进行传输,适用于需要压缩的场景。
gzip
使用 Lempel-Ziv coding (LZ77) 算法进行压缩传输,广泛用于文本内容的压缩(如 HTML、CSS、JS 等)。
identity
表示不进行任何编码或压缩,直接传输原始数据。
多值组合
可以同时指定多个值,用逗号分隔。例如:Transfer-Encoding: gzip, chunked,表示先进行 gzip 压缩,再以分块形式传输。
备注:在chunked和压缩算法多值组合时,这里的压缩算法是单个chunked内的压缩,不是对整体body的压缩。
如果一个http响应头如下:Content-Encoding:deflate Transfer-Encoding:gzip,chunked,那么客户端在收取到每个chunked数据时,先用gzip进行解压缩,收取完所有的chunked后,把解压缩的数据拼到一起,再使用deflate进行解压缩,才能得到服务器最终要发送的数据。
对chunked的描述
chunked 是 HTTP/1.1 中用于分块传输数据的编码方式,适用于动态生成内容或大文件传输的场景。以下是 chunked 格式的详细描述:
(一)、基本格式
每个 chunk 的结构
每个 chunk 由以下部分组成:
块大小:以十六进制表示,后跟 \r\n。
数据内容:实际数据,后跟 \r\n。
示例:
5\r\n // 块大小为5字节
Hello\r\n // 数据内容
结束标记
最后一个 chunk 的块大小为 0,表示传输结束。
示例:
0\r\n\r\n // 结束标记
(二)、完整示例
以下是一个完整的 chunked 传输示例:
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
5\r\n
Hello\r\n
6\r\n
World\r\n
0\r\n\r\n
解析:
第一个 chunk:5\r\nHello\r\n,表示传输了 5 字节的数据 Hello。
第二个 chunk:6\r\n World\r\n,表示传输了 6 字节的数据 World。
结束标记:0\r\n\r\n,表示传输结束。