透视HTTP协议-进阶篇-极客时间-学习笔记
HTTP协议报文是按照header+body的形式,其中body传输的时候是二进制文件,但具体按照什么格式来读取,必须有所约定。就像一个文件,我们改变不同的后缀名,打开完全是不一样的。
报文格式借鉴了电子邮件系统的MIME,“多用途互联网邮件扩展”(Multipurpose Internet Mail Extensions)。
常见的分为下列几种:
text,文本格式的可读数据,比如text/html,text/plain,text/css;
image,图像数据,image/gif,image/jpeg;
audio/video,音视频数据,audio/mpeg,video/mp4;
application,数据格式不固定,可以是文本也可以是二进制数据。application/json,application/javascript,application/pdf。
还有一个编码方式encoding type,选择body体的压缩方式:
gzip:GNU zip 压缩格式,也是互联网上最流行的压缩格式;
deflate:zlib(deflate)压缩格式,流行程度仅次于 gzip;
br:一种专门为 HTTP 优化的新压缩算法(Brotli)。
这样,客户端用Accept,Accept-Encoding来说明可以接受的内容和编码方式;服务端用Content-Type,Content-Encoding来解释最终选择发送的格式和编码方式。
如果请求报文里没有 Accept-Encoding 字段,就表示客户端不支持压缩数据;如果响应报文里没有 Content-Encoding 字段,就表示响应数据没有被压缩。
我们书写的代码都是用英文书写,但客户端那边的使用者可能是各个国家,所以存在一个语言问题。Accept-language就是记录这个。与语言对应的是不同语言的字符集charset。
现在的浏览器都支持多种字符集,通常不会发送 Accept-Charset,而服务器也不会发送 Content-Language。在请求头里一般只会有 Accept-Language 字段,响应头里只会有 Content-Type 字段。对应我自己实验的现象,客户端只是提出请求语言,然后客户端回复UTF-8统一编码即可,然后再交给客户端来自行转换成需求语言。
响应头里没有对应的 Content-Charset,而是在Content-Type字段的数据类型后面用“charset=xxx”来表示。
在 HTTP 协议里用 Accept、Accept-Encoding、Accept-Language 等请求头字段进行内容协商的时候,还可以用一种特殊的“q”参数表示权重来设定优先级,这里的“q”是“quality factor”的意思。
权重的最大值是 1,最小值是 0.01,默认值是 1,如果值是 0 就表示拒绝。具体的形式是在数据类型或语言代码后面加一个“;”,然后是“q=value”。
这样给服务器一些可回复的选择,对应服务器对于内容协商的过程是不透明的,每个 Web 服务器使用的算法都不一样。最后会给出一个Vary参数,记录服务器在内容协商时参考的请求头字段。