0%

内容协商与资源表述

HTTP协议全称是超文本传输协议,超文本也就是对应着我们的一个资源的一种表述,就是我们服务器端一个URI对应的一个页面,我们把它传输到客户端进行渲染显示,那么rest架构呢,也就是我们HTTP协议设计时所遵循的架构,它也是在描述资源状态的一种转移。由于我们一种资源对应着许多种状态,所以我们的客户端在接受我们资源表述的转移时需要进行一种协商。比如:一个来自中国的用户,在他的浏览器访问一个页面时可能得到的是一个中文页面。但是一个其他国家的用户,在用浏览器访问同一个URL时呢,获得的页面可能是用他的本国语言描述的。那么接下来这篇文章中,我们将介绍内容协商是怎样进行的。

内容协商

每个URI指向的资源可以是任何事物,可以由多种不同的表述,例如一份文档可以有不同语言的翻译、不同的媒体格式、可以针对不同的浏览器提供不同的压缩编码等。(同一个URL可能会有很多种语言,比如法语、德语的不同的页面,也可以不同的方式比如说我们可以展示一个html的在页面上显示的格式,也可以直接展示为一个pdf的文档,那么由于我们的浏览器不同,浏览器所支持的压缩算法也是不一样的,而我们的html这种文本语言本身是有很大的压缩空间的,所以,我们既可以以gzip,也可以以br这种压缩方式。所以这就是一个URL对应着资源的许多种不同的表述。)

内容协商的两种方式

  • Proactive主动式内容协商:
    • 指由客户端先在请求头部提出需要的表述形式,而服务器根据这些请求头部提供特定的representation表述(这种主动式内容协商会有一个问题,就是服务器端可能会相对武断,因为它可能拿不到足够的信息)
  • Reactive响应式内容协商:
    • 指服务器返回300 Multiple Choices 或者 406 Not Acceptable,由客户端选择一种表述URI使用(再发起相应的请求)

Proactive主动式内容协商

我们的请求中除了传递URL描述对应的资源以外,还要告诉我接受那种格式(Accept:text/*),我希望那种语言(accept-Language: en),接受哪种压缩的方式(Accept-Encoding:br, gzip ; q = 0.8)(Content-Type:text/html Content-Language: en Content-Encoding: br)

Reactive响应式内容协商

服务器返回了一个列表,列表中是它认为合适的一种表述,通过300这样的响应码返回给客户端,而客户端对这个list中自行决定了一个比较合适的新的一个URL,再次访问服务器端,服务器端给到正确的表述。(有一个问题,RFC规范中没有明确的告诉Client应该依据怎样的规则,所以导致各大浏览器无法按照统一的策略去选择合适的响应表述给用户。所以响应式内容协商相对是很少使用的。)

常见的协商要素(一)

  • 质量因子q:内容的质量、可接受类型的优先级(非常常见,有两种主要的表达方式,第一个是表示内容的质量,我们现在可以想见,如果我们发起请求去获取一张图片,如果这张图片是一张高清图片的缩略图,让用户快速浏览用的,那么我们就可以做非常高的压缩比,那么这个时候的质量因子,就可以比较小。那么如果这个时候我们描述的是一张医学上的图片,那么这个图片中,我们的质量因子就要设的比较大,因为我们不能容忍对这张图片做大幅度的压缩,以使得我们损失了大量的细节。第二个则是表示我们可接受类型的优先级。
  • 媒体资源的MIME类型及质量因子
    • Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    • Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3

常见的协商要素(二)

  • 字符编码:由于UTF-8格式广为使用,Accept-Charset已被废弃
    • Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
  • 内容编码:主要指压缩算法
    • Accept-Encoding: gzip,deflate,br
  • 表述语言
    • Accept-Language:zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
    • Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

国际化与本地化

  • internationalization(i18n,i和n间有18个字符)
    • 指设计软件时,在不同的国家、地区可以不做逻辑实现层面的修改便能够以不同的语言显示
  • localization(l10n,l和n间有10个字符)
    • 指内容协商时,根据请求中的语言及区域信息,选择特定的语言作为资源表述

资源表述的元数据头部

  • 媒体类型、编码
    • content-type: text/html; charset=utf-8
  • 内容编码
    • content-encoding: gzip
  • 语言
    • Content-Language: de-DE, en-CA

小结

内容协商将决定服务器端生成不同的HTTP包体传输给客户端。下一篇文章将介绍HTTP消息包体的传输方式。