透视HTTP协议

June 12, 2022

15 | 海纳百川:HTTP的实体数据

数据类型与编码

MIME type, 用于标记body的数据类型 形式是type/subtype字符串。下列是经常遇到的类型:

  1. text: 文本格式的可读数据,最熟悉的就是text/html,表示超文本文档,此外还有纯文本text/plain,样式表text/css等
  2. image: 图像文件,有image/gif、image/jpeg、image/png等
  3. audio/video:音频和视频数据,有audio/mpeg、video/mp4等
  4. 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


Profile picture

百事可乐

Let it snow, let it snow, let it snow