http协议_数据协商

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jt102605/article/details/86620367

http协议中,可以通过内容协商返回最合适的内容,例如根据浏览器的默认语言选择返回中文界面还是英文界面。

在客户端发送给服务端一个请求的时候,客户端可以声明该请求所期望获得的数据格式和数据相关的一些属性,服务端会根据客户端声明的请求做出判断并给出相应的结果

实现方式一:

客户端设置特定的 HTTP 首部字段,例如 Accept、Accept-Charset、Accept-Encoding、Accept-Language,服务器根据这些字段返回特定的资源。

1. 在客户端的请求中

  • Accept : 指定期望的数据类型  (MIME Type)
  • Accept-Encoding : 指定期望的数据编码方式,主要用于限制服务端的数据压缩
  • Accept-Language : 指定期望的数据语言
  • User-Agent : 用于表示浏览器的一些相关信息,如移动端的浏览器或者pc端的浏览器
  • Content-Type : 指定发送的数据类型

2. 在服务端返回时

  • Content-Type : 对应"Accept",指定返回的数据类型
  • Content-Encoding : 对应"Accept-Encoding",指定返回的数据编码方式
  • Content-Language : 对应"Accept-Language",指定返回数据的语言

存在以下问题:

  1. 服务器很难知道客户端浏览器的全部信息;
  2. 客户端提供的信息相当冗长(HTTP/2 协议的首部压缩机制缓解了这个问题),并且存在隐私风险(HTTP 指纹识别技术);
  3. 给定的资源需要返回不同的展现形式,共享缓存的效率会降低,而服务器端的实现会越来越复杂。

实现方式二:

服务器通过返回 300 Multiple Choices 或者 406 Not Acceptable,客户端从中选出最合适的那个资源

 

Vary

Vary: Accept-Language

在使用内容协商的情况下,只有当缓存服务器中的缓存满足内容协商条件时,才能使用该缓存,否则应该向源服务器请求该资源。

例如,一个客户端发送了一个包含 Accept-Language 首部字段的请求之后,源服务器返回的响应包含 Vary: Accept-Language 内容,缓存服务器对这个响应进行缓存之后,在客户端下一次访问同一个 URL 资源,并且 Accept-Language 与缓存中的对应的值相同时才会返回该缓存。

 

猜你喜欢

转载自blog.csdn.net/jt102605/article/details/86620367