内容协商(Content Negotiation)
字数 916 2025-11-17 08:02:10

内容协商(Content Negotiation)

内容协商是HTTP协议中的一种机制,允许客户端和服务器就响应的表现形式(如语言、编码格式、字符集等)进行协商,确保返回的资源版本最符合客户端的需求。

  1. 基础概念

    • 当客户端(如浏览器)请求资源时,可通过HTTP头声明其偏好(如支持的语言、文件格式)。服务器根据这些偏好返回最合适的资源版本,而非固定内容。
    • 例如:用户访问多语言网站时,浏览器通过Accept-Language头声明首选语言,服务器返回对应语言的页面。
  2. 协商维度

    • 语言协商:通过Accept-Language头指定语言(如en-US, zh-CN)。
    • 内容类型协商:通过Accept头指定支持的MIME类型(如text/html, application/json)。
    • 编码协商:通过Accept-Encoding头声明支持的压缩格式(如gzip, br)。
    • 字符集协商:通过Accept-Charset头指定字符集(如UTF-8)。
  3. 协商机制类型

    • 服务端驱动协商:客户端提交偏好头,服务器决策并返回资源,同时在响应头中说明所选版本(如Content-Language)。
    • 代理驱动协商:若服务器无法直接决策,返回300 Multiple Choices响应,列出可选版本,由客户端选择后重新请求。
  4. 实际应用示例

    • 浏览器请求头:
      Accept: text/html, application/xhtml+xml  
      Accept-Language: en, fr;q=0.9  
      Accept-Encoding: gzip  
      
    • 服务器解析后返回英文HTML内容,并用gzip压缩,响应头包含:
      Content-Type: text/html  
      Content-Language: en  
      Content-Encoding: gzip  
      
  5. 技术扩展与优化

    • 质量值(q-value):客户端通过q参数(如fr;q=0.9)表示优先级,数值范围0~1,默认1。
    • Vary头:服务器在响应中标注Vary: Accept-Language,告知缓存服务器根据不同语言缓存多个版本。
    • 现代替代方案:如URL参数(/page?lang=en)或子域名(en.example.com),但内容协商仍保持HTTP协议原生优势。
  6. 应用场景

    • 多语言网站动态适配用户语言。
    • API同时支持JSON和XML格式(通过Accept头区分)。
    • 压缩传输以减少带宽消耗(如自动选择Brotli或gzip)。
内容协商(Content Negotiation) 内容协商是HTTP协议中的一种机制,允许客户端和服务器就响应的表现形式(如语言、编码格式、字符集等)进行协商,确保返回的资源版本最符合客户端的需求。 基础概念 当客户端(如浏览器)请求资源时,可通过HTTP头声明其偏好(如支持的语言、文件格式)。服务器根据这些偏好返回最合适的资源版本,而非固定内容。 例如:用户访问多语言网站时,浏览器通过 Accept-Language 头声明首选语言,服务器返回对应语言的页面。 协商维度 语言协商 :通过 Accept-Language 头指定语言(如 en-US, zh-CN )。 内容类型协商 :通过 Accept 头指定支持的MIME类型(如 text/html, application/json )。 编码协商 :通过 Accept-Encoding 头声明支持的压缩格式(如 gzip, br )。 字符集协商 :通过 Accept-Charset 头指定字符集(如 UTF-8 )。 协商机制类型 服务端驱动协商 :客户端提交偏好头,服务器决策并返回资源,同时在响应头中说明所选版本(如 Content-Language )。 代理驱动协商 :若服务器无法直接决策,返回 300 Multiple Choices 响应,列出可选版本,由客户端选择后重新请求。 实际应用示例 浏览器请求头: 服务器解析后返回英文HTML内容,并用gzip压缩,响应头包含: 技术扩展与优化 质量值(q-value) :客户端通过 q 参数(如 fr;q=0.9 )表示优先级,数值范围0~1,默认1。 Vary头 :服务器在响应中标注 Vary: Accept-Language ,告知缓存服务器根据不同语言缓存多个版本。 现代替代方案 :如URL参数( /page?lang=en )或子域名( en.example.com ),但内容协商仍保持HTTP协议原生优势。 应用场景 多语言网站动态适配用户语言。 API同时支持JSON和XML格式(通过 Accept 头区分)。 压缩传输以减少带宽消耗(如自动选择Brotli或gzip)。