内容协商与编码
内容协商如何为客户端挑选资源表示?
- 定义: 服务端根据客户端的语言、字符集或编码偏好, 返回最合适的资源表示;
- 请求字段:
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 字节
- 与条件请求配合的
If-Range见 HTTP 缓存机制;