If-Match
用法
If-Match 头通过比较 ETag 值来启用条件请求。客户端包含该头以确保服务器仅在资源当前的实体标签与所列值之一匹配时才处理请求。
对于 GET 和 HEAD 等安全方法,If-Match 头将响应限制为具有匹配实体标签的资源。这用于选择特定表示,而非验证缓存(缓存验证改用 If-None-Match)。
对于 PUT 和 DELETE 等改变状态的方法,If-Match 头可防止更新丢失问题。当两个客户端获取同一资源、各自独立地修改其副本并试图写回时,If-Match 头确保只有第一次写入成功。第二次写入会因 ETag 在第一次写入后发生变化而以 412 Precondition Failed 失败。
这种模式被称为乐观并发控制。客户端读取资源及其 ETag,在本地进行更改,然后在 If-Match 设为原始 ETag 的情况下提交更新。服务器在应用更新之前确认资源在此期间未发生变化。
If-Match 头仅执行强比较。弱实体标签(以 W/ 为前缀)不匹配,即使不透明值完全相同也是如此。这种严格行为确保资源的字节级一致性。
实体标签列表
一个或多个用双引号括起、以逗号分隔的 ETag 值。服务器将每个值与资源当前的实体标签进行比对。
通配符(*)
星号 * 匹配资源的任何当前表示。只要目标资源存在,无论其实体标签值如何,这种形式都会成功。* 值常与 PUT 一起使用,以防在目标 URI 已存在资源时创建新资源。
示例
客户端发送一个 PUT 请求来更新资源。If-Match 头携带来自原始 GET 响应的 ETag。只有当 ETag 仍然匹配时,服务器才会应用更新。
PUT /document/42 HTTP/1.1
Host: api.example.re
Content-Type: application/json
If-Match: "a1b2c3d4"
{"title": "Updated Document"}
当资源已被另一个客户端修改时,ETag 不再匹配。服务器以 412 Precondition Failed 响应并拒绝该更新。
HTTP/1.1 412 Precondition Failed
Content-Type: application/json
ETag: "e5f6g7h8"
多个实体标签以逗号分隔的值列出。当所列值中任意一个与资源当前的 ETag 匹配时,条件即成立。
If-Match: "a1b2c3d4", "x9y8z7w6"
通配符形式在资源存在时成立。这可防止 PUT 意外创建新资源。
If-Match: *