本文为极客时间《透视HTTP协议》笔记
数据类型与编码
为了方便上层应用对于HTTP传输数据的处理,HTTP使用“MIME type”的方式在报文中对数据类型进行标注,并将其纳入到头字段中。其格式为
type/subtype
HTTP中常见的几种数据类型有
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 还是就是未知的application/octet-stream 即不透明的二进制文件
除了使用MIME type标记数据格式外,还会使用“Encoding Type”来标记数据压缩的方式,以便接收方可以正确的解压数据,常见的压缩方式有:
gzip
deflate
br
虽然文本类型的数据都可以用text/html来标记,但为了区分不同国家和语言,HTTP引入了语言类型和字符集。分别是Language和Charset
Language 为type-subtype 的格式 如en-GB,zh-CN等
Charset 常见的如 utf-8 gbk 等
内容协商
HTTP协议定义了Accept请求头作为请求方告诉发送方希望接受什么数据。而Content头告诉请求方发送了什么样的数据。
Content
Accept: text/html,application/xml,image/webp,image/png // 我可以接受这几种格式的内容
Content-Type:text/html //发送的实际内容格式
Encoding
表示对压缩方式的协商,此字段可以省略表示请求方不支持压缩数据
Accept-Encoding :gzip,deflate,br
Content-Encoding: gzip
Charset & Language
表示对于字符和语言的协商,一般来说现在的浏览器支持多种字符集,通常不会发送Accept-Charset,而服务器也不会发送Content-Language,因为使用的语言完全由字符集推断,所以请求头里面一般只有Accept-Language 字段,响应头里面只有Content-Type字段。
Accept-Language: zh-CN,zh
Content-Language : zh-CN
Accept-Charset: gbk,utf-8
Content-Type: text/html; charset=utf-8 //无单独的content-Accept字段
内容协商质量值
在HTTP协议中在请求头字段进行内容协商的时候可以使用q(quality factor)进行权重标记
1为最大值,0.01为最小值,如果是0就表示拒绝。
Accept: text/html,application/xml;q=0.9,*/*;q=0.8
内容协商的结果
内容协商的内容是不透明的,每个Web服务器使用的算法都不一样,但是有的时候,服务器会在响应头里加多一个Vary字段,记录服务器在内容协商时参考的请求头字段:
Vary: Accept-Encoding,User-Agent,Accept //表示依据了这3个字段