内容协商

Request
Response
协商的内容
说明

Accept

Content-Type

数据类型

实体数据的内容

Accept-Encoding

Content-Encoding

数据编码

实体数据的压缩方式

Accept-Language

Content-Language

语言类型

实体数据的自然语言

Accept-Charset

语言编码

实体数据的编码方式

  • Accept-* client 说明自己可以 Accept(接受、支持)的格式

  • Content-* server 说明实际 Content 长什么样子

// request
Accept: text/html,application/xml,image/webp,image/png
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN, zh, en
Accept-Charset: gbk, utf-8
// response
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Content-Language: zh-CN

数据类型

早在 HTTP 协议诞生之前,电子邮件就可以发送 ASCII 码以外的任意数据,方案的名字叫做 MIME。MIME 是一个很大的标准规范,但 HTTP 只取了其中的一部分,用来标记 body 的数据类型,这就是我们平常总能听到的 MIME type。

MIME,Multipurpose Internet Mail Extensions,多用途互联网邮件扩展。

MIME 把数据分成了八大类,每个大类下再细分出多个子类,形式是 "type/subtype" 的字符串。

type
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 就表示拒绝。

// 表示:浏览器最希望使用的是 HTML 文件,权重是 1
//      其次是 XML 文件,权重是 0.9
//      最后是任意数据类型,权重是 0.8
// 服务器在收到请求头后,会计算权重,然后根据自己的实际情况优先输出 HTML 或者 XML
Accept: text/html,application/xml;q=0.9,*/*;q=0.8
  • 值和权重之间用 ; 分隔

  • 多个值之间用 , 分隔

数据压缩

数据压缩,默认开启,通常是保底的。

常用的 Encoding type 只有下面三种:

压缩方式
说明

gzip

GNU zip 压缩格式,是互联网上最流行的压缩格式

对于“文本文件”,gzip 等压缩算法的效果还是很好的 所以各大网站的服务器都会使用这个手段作为保底 比如 Nginx 里会使用 gzip on 指令启用对 text/html 的压缩

然而,对于图片、音频、视频等多媒体数据, 它们本身就已经是高度压缩的, 如果再用 gzip 处理也不会变小,甚至还有可能会增大一点。

deflate

zlib(deflate)压缩格式,流行程度仅次于 gzip

br

一种专门为 HTTP 优化的新压缩算法(Brotli)

Vary 字段

内容协商的过程是不透明的,每个 web 服务器使用的算法都不一样。

但有时候,服务器会在 response header 里多加一个 Vary 字段,记录服务器在内容协商时参考的请求头字段,给出一点信息。比如:

// 表示服务器在返回报文时,依据了 Accept-Encoding, User-Agent 和 Accept 这三个头字段
Vary: Accept-Encoding,User-Agent,Accept

Vary 字段可以认为是响应报文的一个特殊的“版本标记”。每当 Accept 等请求 header 变化时,Vary 也会随着响应报文一起变化。也就是说,同一个 URI 可能会有多个不同的“版本”,主要用在传输链路中间的代理服务器实现缓存服务。

Last updated