0%

HTTP的实体数据

一个HTTP报文是由“header+body”组成的

HTTP的Body

数据类型与编码

HTTP取了MIME其中的一部分,用来标记body的数据类型,这就是我们平常总能听到的“MIME type”。

HTTP使用MIME type来标记数据类型

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

在HTTP里经常遇到的几个类别:

  1. text:即文本格式的可读数据,例如:超文本文档text/html、纯文本text/plain、样式表text/css等。
  2. image:即图像文件,有image/gifimage/jpegimage/png等。
  3. audio/video:音频和视频数据,例如audio/mpegvideo/mp4等。
  4. application:数据格式不固定,可能是文本也可能是二进制,必须由上层应用程序来解释。常见的有
    application/jsonapplication/javascriptapplication/pdf等,另外,如果实在是不知道数据是什么类型,像刚才说的“黑盒”,就会是application/octet-stream,即不透明的二进制数据。

为HTTP在传输时为了节约带宽,有时候还会压缩数据,还需要有一个“Encoding type”。

HTTP使用Encoding type来压缩数据

  1. gzip:GNU zip压缩格式,也是互联网上最流行的压缩格式;
  2. deflate:zlib(deflate)压缩格式,流行程度仅次于gzip;
  3. br:一种专门为HTTP优化的新压缩算法(Brotli)。

有了MIME type和Encoding type,无论是浏览器还是服务器就都可以轻松识别出body的类型,也就能够正确处理数据了。

数据类型使用的头字段

客户端用Accept头告诉服务器希望接收什么样的数据,而服务器用Content头告诉客户端
实际发送了什么样的数据

  • Accept字段标记的是客户端可理解的MIME type

    例:client告诉server:“我能够看懂HTML、XML的文本,还有webp和png的图片,请给我这四类格式的数据。

    1
    Accept: text/html,application/xml,image/webp,image/png
  • 服务器会在响应报文里用头字段Content-Type告诉实体数据的真实类型:

    1
    2
    Content-Type: text/html
    Content-Type: image/png
  • Accept-Encoding字段标记的是客户端支持的压缩格式

    1
    Accept-Encoding: gzip, deflate, br
  • 服务器的响应报文吧压缩格式放在响应头字段ContentEncoding里。

    1
    Content-Encoding: gzip

语言类型使用的头字段

HTTP协议也使用Accept请求头字段Content实体头字段,用于客户端和服务器就语言与编码进
行“内容协商”。

  • Accept-Language字段标记了客户端可理解的自然语言

    1
    Accept-Language: zh-CN, zh, en
  • 服务器在响应报文里用头字段Content-Language告诉客户端实体数据使用的实际语言类型

    1
    Content-Language: zh-CN
  • 字符集在HTTP里使用的**请求头字段(client)**是Accept-Charset

    1
    Accept-Charset: gbk, utf-8
  • **响应头(server)**里却没有对应的Content-Charset,而在Content-Type字段的数据类型后面用charset=xxx来表示

    1
    Content-Type: text/html; charset=utf-8

内容协商的质量值

在HTTP协议里用Accept、Accept-Encoding、Accept-Language等请求头字段进行内容协商的时候,还可以用一种特殊的“q”参数表示权重来设定优先级,这里的“q”是“quality factor”的意思。

在数据类型或语言代码后面加一个;,然后是q=value

注意:

;的用法,在大多数编程语言里;的断句语气要强于,,而在HTTP的内容协商里却恰好反了过来,;的意义是小于“,”的。

例子:

1
Accept: text/html,application/xml;q=0.9,*/*;q=0.8

表示浏览器最希望使用的是HTML文件,权重是1,其次是XML文件,权重是0.9,最后是任意数据类型,权重是0.8。