一个HTTP报文是由“header+body”组成的
HTTP的Body
数据类型与编码
HTTP取了MIME其中的一部分,用来标记body的数据类型,这就是我们平常总能听到的“MIME type”。
HTTP使用MIME type来标记数据类型
MIME把数据分成了八大类,每个大类下再细分出多个子类,形式是“type/subtype”的字符串
在HTTP里经常遇到的几个类别:
- text:即文本格式的可读数据,例如:超文本文档
text/html
、纯文本text/plain
、样式表text/css
等。 - image:即图像文件,有
image/gif
、image/jpeg
、image/png
等。 - audio/video:音频和视频数据,例如
audio/mpeg
、video/mp4
等。 - application:数据格式不固定,可能是文本也可能是二进制,必须由上层应用程序来解释。常见的有
application/json
,application/javascript
、application/pdf
等,另外,如果实在是不知道数据是什么类型,像刚才说的“黑盒”,就会是application/octet-stream,即不透明的二进制数据。
为HTTP在传输时为了节约带宽,有时候还会压缩数据,还需要有一个“Encoding type”。
HTTP使用Encoding type来压缩数据
- gzip:GNU zip压缩格式,也是互联网上最流行的压缩格式;
- deflate:zlib(deflate)压缩格式,流行程度仅次于gzip;
- br:一种专门为HTTP优化的新压缩算法(Brotli)。
有了MIME type和Encoding type,无论是浏览器还是服务器就都可以轻松识别出body的类型,也就能够正确处理数据了。
数据类型使用的头字段
客户端用Accept头告诉服务器希望接收什么样的数据,而服务器用Content头告诉客户端
实际发送了什么样的数据
Accept
字段标记的是客户端可理解的MIME type
例:client告诉server:“我能够看懂HTML、XML的文本,还有webp和png的图片,请给我这四类格式的数据。
1
Accept: text/html,application/xml,image/webp,image/png
服务器会在响应报文里用头字段Content-Type告诉实体数据的真实类型:
1
2Content-Type: text/html
Content-Type: image/pngAccept-Encoding
字段标记的是客户端支持的压缩格式1
Accept-Encoding: gzip, deflate, br
服务器的响应报文吧压缩格式放在响应头字段
ContentEncoding
里。1
Content-Encoding: gzip
语言类型使用的头字段
HTTP协议也使用Accept请求头字段
和Content实体头字段
,用于客户端和服务器就语言与编码进
行“内容协商”。
Accept-Language
字段标记了客户端可理解的自然语言1
Accept-Language: zh-CN, zh, en
服务器在响应报文里用头字段
Content-Language
告诉客户端实体数据使用的实际语言类型1
Content-Language: zh-CN
字符集在HTTP里使用的**请求头字段(client)**是
Accept-Charset
1
Accept-Charset: gbk, utf-8
**响应头(server)**里却没有对应的Content-Charset,而在Content-Type字段的数据类型后面用
charset=xxx
来表示1
Content-Type: text/html; charset=utf-8
内容协商的质量值
在HTTP协议里用Accept、Accept-Encoding、Accept-Language等请求头字段进行内容协商的时候,还可以用一种特殊的“q”参数表示权重来设定优先级,这里的“q”是“quality factor”的意思。
在数据类型或语言代码后面加一个;
,然后是q=value
。
注意:
;
的用法,在大多数编程语言里;
的断句语气要强于,
,而在HTTP的内容协商里却恰好反了过来,;
的意义是小于“,”的。
例子:
1 | Accept: text/html,application/xml;q=0.9,*/*;q=0.8 |
表示浏览器最希望使用的是HTML文件,权重是1,其次是XML文件,权重是0.9,最后是任意数据类型,权重是0.8。