15 | 海纳百川:HTTP的实体数据
数据类型与编码
MIME type, 用于标记body的数据类型 形式是type/subtype字符串。下列是经常遇到的类型:
- 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/octet-stream,即不透明的二进制数据
仅有MIME type还不够,为了在传输时节约带宽,有时候还会压缩数据,为了不要让浏览器继续“猜”,还有一个Encoding type。
Encoding type常用有三种: 1.gzip: GNU zip压缩格式 2.deflate: zlib(deflate)压缩格式 3.br: 一种专门为HTTP优化的新压缩算法
数据类型使用的头字段
有了 MIME type 和 Encoding type,无论是浏览器还是服务器就都可以轻松识别出 body 的类型,也就能够正确处理数据了。
客户端用Accept头告诉服务器希望接受什么样的数据,服务器用Content告诉客户端实际发送了什么数据
Accept字段标记的是客户端可以理解的MIME type,可以用,做分隔符列出多个类型
Accept: text/html,application/xml,image/webp,image/png
这就是告诉服务器:浏览器能看懂html、xml的文本,还有webp和png的图片。
服务器会在响应报文里使用头字段Content-Type告诉实体数据的真实类型
Content-Type: text/html
Content-Type: image/png
浏览器看到不同类型就会做不同的操作来显示
Accept-Encoding字段标记的是客户端支持的压缩格式,例如上面说的gzip、deflate,服务器可以选择其中一种来压缩数据,实际使用的压缩格式放在响应字段Content-Encoding里
Accept-Encoding: gzip, deflate, br
Content-Encoding: gzip
不过这两个字段是可以省略的。如果请求报文里没有Accept-Encoding,表示客户端不支持压缩;如果响应报文烈没有Content-Encoding字段,表示响应数据没有被压缩。
语言类型与编码
语言类型指人类使用的自然语言,例如英语、汉语、日语等
语言类型使用的头字段
Accept-Language字段标记了客户端可理解的自然语言
Accept-Language: zh-CN, zh, en
这个请求头告诉服务器,优先给zh-CN的汉语文字,如果没有就给其他汉语方言,如果还没有就给英语
服务器应该在响应报文里用头字段 Content-Language 告诉客户端实体数据使用的实际语言类型:
Content-Language: zh-CN
内容协商质量值
在 HTTP 协议里用 Accept、Accept-Encoding、Accept-Language 等请求头字段进行内容协商的时候,还可以用一种特殊的“q”参数表示权重来设定优先级,这里的“q”是“quality factor”的意思。
权重的最大值是 1,最小值是 0.01,默认值是 1,如果值是 0 就表示拒绝。
Accept: text/html,application/xml;q=0.9,*/*;q=0.8
它表示浏览器最希望使用的是 HTML 文件,权重是 1,其次是 XML 文件,权重是 0.9,最后是任意数据类型,权重是 0.8。
内容协商的结果
但有的时候,服务器会在响应头里多加一个 Vary 字段,记录服务器在内容协商时参考的请求头字段
Vary: Accept-Encoding,User-Agent,Accept
这个 Vary 字段表示服务器依据了 Accept-Encoding、User-Agent 和 Accept 这三个头字段,然后决定了发回的响应报文。
假设你要使用 POST 方法向服务器提交一些 JSON 格式的数据,里面包含有中文,请求头应该是什么样子的呢?
content-type: application/json, charset=gbk
content-language:zh-cn, zh