❕内容协商
Last updated
Last updated
Accept
Content-Type
数据类型
实体数据的内容
Accept-Encoding
Content-Encoding
数据编码
实体数据的压缩方式
Accept-Language
Content-Language
语言类型
实体数据的自然语言
Accept-Charset
语言编码
实体数据的编码方式
Accept-*
client 说明自己可以 Accept(接受、支持)的格式
Content-*
server 说明实际 Content 长什么样子
早在 HTTP 协议诞生之前,电子邮件就可以发送 ASCII 码以外的任意数据,方案的名字叫做 MIME。MIME 是一个很大的标准规范,但 HTTP 只取了其中的一部分,用来标记 body 的数据类型,这就是我们平常总能听到的 MIME type。
MIME,Multipurpose Internet Mail Extensions,多用途互联网邮件扩展。
MIME 把数据分成了八大类,每个大类下再细分出多个子类,形式是 "type/subtype" 的字符串。
text
text/html text/xml text/css text/plain
application
application/javascript
application/json
application/pdf
application/zip
application/x-www-form-urlencoded
application 的数据格式不固定
可能是文本也可能是二进制
必须由上层应用程序来解释
multipart
multipart/form-data
<input type=file>
multipart/byteranges
范围请求的多段请求
image
image/jpeg
image/png image/gif
image/svg+xml
图像
audio
audio/mpeg
audio/ogg
音频
video
video/mp4
视频
font
字体
model
model/obj
example
在协商数据类型的时候,还可以用 q
参数来设置优先级,q 即 quality factor,质量因子。
q 的最大值是 1,最小值是 0.01。默认值是 1,如果值是 0 就表示拒绝。
值和权重之间用 ;
分隔
多个值之间用 ,
分隔
数据压缩,默认开启,通常是保底的。
常用的 Encoding type 只有下面三种:
gzip
GNU zip 压缩格式,是互联网上最流行的压缩格式
对于“文本文件”,gzip 等压缩算法的效果还是很好的
所以各大网站的服务器都会使用这个手段作为保底
比如 Nginx 里会使用 gzip on
指令启用对 text/html 的压缩
然而,对于图片、音频、视频等多媒体数据, 它们本身就已经是高度压缩的, 如果再用 gzip 处理也不会变小,甚至还有可能会增大一点。
deflate
zlib(deflate)压缩格式,流行程度仅次于 gzip
br
一种专门为 HTTP 优化的新压缩算法(Brotli)
Vary
字段内容协商的过程是不透明的,每个 web 服务器使用的算法都不一样。
但有时候,服务器会在 response header 里多加一个 Vary
字段,记录服务器在内容协商时参考的请求头字段,给出一点信息。比如:
Vary
字段可以认为是响应报文的一个特殊的“版本标记”。每当 Accept 等请求 header 变化时,Vary
也会随着响应报文一起变化。也就是说,同一个 URI 可能会有多个不同的“版本”,主要用在传输链路中间的代理服务器实现缓存服务。