HTTPQUERY
English

226 IM Used

用法

226 IM Used 响应告知客户端:消息体包含的是资源的一个修改版本,而非完整表示。一种常见用途是增量编码(delta encoding),其中只传输缓存版本与当前版本之间的差异,从而节省带宽。

服务器应用客户端通过 A-IM 请求头声明支持的实例操作(instance manipulations)。被接受的操作以逗号分隔列在同一行内,或分列于多行。

缓存

226 IM Used 响应遵循其自身规范中定义的增量缓存规则,而非标准的启发式缓存清单。该响应可与已缓存的基准实例配合使用,以构建当前实例的缓存条目;当存在标准 Cache-Control 指令时,这些指令仍然适用。

未经修改的当前实例并不总是可以直接获得。重建完整资源需要将 226 响应与先前缓存的基准实例相结合,并以服务器所应用的实例操作为指引。

示例

客户端从空缓存开始,请求一个 PDF 文件。Accept-Encoding 请求头表明支持 gzip 压缩。服务器以完整的 gzip 编码文件和 200 状态作出响应。

在下一次请求中,客户端通过在 If-None-Match 请求头中携带第一次响应的 ETag 值,来检查文档是否发生变化。客户端还通过 A-IM 请求头声明支持 vcdiff 增量编码。

服务器检测到该资源自原始 ETag 以来已发生变化,于是生成一个增量文件。若资源未变化,则改为产生 304。响应中的 Delta-Base 请求头标识该增量是相对于哪个缓存版本计算的。IM 请求头列出所应用的实例操作。

请求

GET /livingdocs/current_specs.pdf HTTP/1.1
Host: example.com
Accept-Encoding: gzip

响应

HTTP/1.1 200 OK
ETag: "1234-000"
Content-Encoding: gzip

<gzip-compressed file>

请求(后续)

GET /livingdocs/current_specs.pdf HTTP/1.1
Host: example.com
If-None-Match: "1234-000"
Accept-Encoding: gzip
A-IM: vcdiff

响应(增量)

HTTP/1.1 226 IM Used
ETag: "1234-111"
Delta-Base: "1234-000"
Content-Encoding: gzip
IM: vcdiff

<gzip-compressed delta file>

代码参考

.NET

HttpStatusCode.IMUsed

Rust

http::StatusCode::IM_USED

Rails

:im_used

Go

http.StatusIMUsed

Symfony

Response::HTTP_IM_USED

Python3.5+

http.HTTPStatus.IM_USED

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_IM_USED

Angular

@angular/common/http/HttpStatusCode.ImUsed