11 HTTP body中常见字段

Posted by CodingWithAlice on April 24, 2021

11 HTTP body中常见字段

小结:

image-20210424162600086

1、数据类型 表示实体数据的 内容 是什么,使用的是 MIME type,相关的头字段是 AcceptContent-Type 2、数据编码 表示实体数据的 压缩方式,相关的头字段是 Accept-EncodingContent-Encoding 3、语言类型 表示实体数据的 自然语言,相关的头字段是 Accept-LanguageContent-Language 4、字符集 表示实体数据的 编码方式,相关的头字段是 Accept-CharsetContent-Type 5、客户端需要在请求头里使用 Accept 等头字段与服务器进行 内容协商,要求服务器返回最合适的数据 6、Accept 等头字段可以用 , 顺序列出多个可能的选项,还可以用 ;q=value 参数来精确 指定权重

数据类型与压缩

需求1:声明数据类型

MIME type - 标记 body 的数据类型,形式是 type/subtype 的字符串

  • text:即文本格式的可读数据 例如 text/html 超文本文档、text/plain 纯文本、text/css 样式表 等

  • image:即图像文件 例如 image/gifimage/jpegimage/png

  • audio/video:音频和视频数据 例如 audio/mpegvideo/mp4

  • application数据格式不固定 例如 application/jsonapplication/javascriptapplication/pdfapplication/octet-stream,即不透明的二进制数据等

需求2:压缩数据类型

HTTP 在传输时为了节约带宽,有时候还会压缩数据 Encoding type - 编码格式

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

HTTP 协议为此定义了两个 Accept 请求头字段和两个 Content 实体头字段,用于客户端和服务器进行 内容协商

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

  • Accept - 标记 客户端可理解的 MIME type

    Accept 字段标记的是客户端可理解的 MIME type,可以用 , 做分隔符列出多个类型,让服务器有更多的选择余地

    Accept: text/html,application/xml,image/webp,image/png
    
  • Content - 标记 服务器传输的真实类型

    服务器在响应报文里用头字段 Content-Type 告诉实体数据的真实类型

    Content-Type: text/html
    Content-Type: image/png
    

  • Accept-Encoding - 标记的是 客户端支持的压缩格式

    如果请求报文里没有 Accept-Encoding 字段,就表示客户端 不支持压缩数据

    Accept-Encoding: gzip, deflate, br
    
  • Content-Encoding - 标记 服务器实际使用的压缩格式 如果响应报文里没有 Content-Encoding 字段,就表示响应数据 没有被压缩

    Content-Encoding: gzip
    

语言类型与字符集

需求1:语言类型- 国际化

使用 type-subtype 的形式

  • 注意:该属性的格式与数据类型不同,分隔符不是 /,而是 -,例如:

    en 表示任意的英语,en-US 表示美式英语,en-GB 表示英式英语,而 zh-CN 就表示我们最常使用的汉语

需求2:字符集

英语世界用的 ASCII

汉语世界用的 GBKBIG5

日语世界用的 Shift_JIS

—> 后来就出现了 UnicodeUTF-8,把世界上所有的语言都容纳在一种编码方案里

UTF-8 也成为了互联网上的标准字符集


  • Accept-Language - 标记了 客户端可理解的自然语言,也允许用 , 做分隔符列出多个类型,按照 顺序代表优先级,例如:
    Accept-Language: zh-CN, zh, en
    
  • Content-Language - 服务端返回数据使用的 实际语言类型
    Content-Language: zh-CN
    

  • Accept-Charset - 客户端可理解的字符集
    Accept-Charset: gbk, utf-8
    

    但响应头里却没有对应的 Content-Charset,而是在 Content-Type 字段的数据类型后面用 charset=xxx 来表示服务器实际使用的字符集

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

内容协商的质量值

AcceptAccept-EncodingAccept-Language 等请求字段中,可以使用特殊的 q 参数表示 权重 来设定优先级:权重的最大值是 1,最小值是 0.01,默认值是 1,如果值是 0 就表示拒绝 —> 形如 ;q=0.8

【注意:在 HTTP 的内容协商里却恰好反了过来,; 的意义是小于 , 的】

  • 举个例子

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

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