跳到主要内容

内容协商与编码

内容协商如何为客户端挑选资源表示?​

  • 定义: 服务端根据客户端的语言、字符集或编码偏好, 返回最合适的资源表示;
  • 请求字段: Accept、Accept-Charset、Accept-Encoding、Accept-Language;
  • 响应字段: Content-Language 等;
  • 三种实现方式:
    • 服务器协商: 服务端按请求首部自动选择;
    • 客户端协商: 由用户或 JS 脚本在客户端选择;
    • 同名协商: 服务端与客户端各自协商后再匹配;

内容编码怎样压缩报文主体?​

  • 目的: 压缩报文实体体积, 降低传输量;
  • 常用编码: gzip(GNU zip)、compress(UNIX 标准)、deflate(zlib)、identity(不编码);
  • 分块传输编码 (Chunked Transfer Coding): 用于大体积数据, 把报文实体拆成若干块传输, 客户端负责解码还原;
  • 区分: 内容编码由 Accept-Encoding 协商, 传输编码由 TE 协商;

MIME 与多部分对象集合解决什么问题?​

  • MIME: 多用途因特网邮箱扩展 (Multipurpose Internet Mail Extensions), 用于标识数据类型;
  • 多部分对象集合: 让一份报文容纳多种类型的数据;
  • 常见类型:
    • multipart/form-data: 表单文件上传;
    • multipart/byteranges: 206 响应的多段范围主体;

范围请求如何只取资源的一部分?​

  • 请求: 用 Range 指定字节范围;
  • 响应: 能响应时返回 206 与 multipart/byteranges 主体; 无法响应时返回 200 与完整实体;
  • 能力声明: 服务端用 Accept-Ranges 表明是否支持;
  • 用途: 断点续传与流式播放;
Range: bytes=5001-10000 # 5001-10000 字节
Range: bytes=5001- # 5001 之后全部字节
Range: bytes=-3000, 5000-7000 # 末尾 3000 字节与 5000-7000 字节