3.2 If-None-Match

1 阅读2分钟

3.2 If-None-Match

rfc 7232 3.2 If-None-Match

If-None-Match: "A", "B",服务器返回304,cache如何决定用哪一个?

If-None-Match 判定为true,服务器返回200

没有找到rfc中对上述操作的定义

POST什么时候会被缓存,找到对应的定义

取值

// 第一种
If-None-Match: "xyzzy"
If-None-Match: W/"xyzzy"
If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"

// 第二种
If-None-Match: *

entity-tags对比方式

必须(MUST)使用weak comparison function

使用场景

检查缓存有效性,以提升性能

  • 核心逻辑:当客户端(如浏览器或 Android App)本地已经存了一个带 ETag(实体标签)的资源快照,但由于缓存过期(Stale),它不确定服务器上的资源是否发生了变化。

  • 操作方式:客户端在请求中带上 If-None-Match: "旧的ETag"。

  • 结果处理

    • 匹配成功(未修改):服务器发现 ETag 没变,直接返回 304 Not Modified,不传输正文数据。这极大地节省了带宽和加载时间。

    • 匹配失败(已修改):服务器返回 200 OK 并附带最新的资源内容。

防止冲突的“条件式写操作”

通常配合 PUT 等“不安全”的方法使用。

  • 核心逻辑:解决**“丢失更新”(Lost Update)的问题。主要用于客户端想创建一个新资源,但前提是这个位置目前必须是空的**。

  • 操作方式:客户端使用 If-None-Match: *。这里的通配符 * 代表“任何存在的实体”。

  • 结果处理

  • 如果资源已存在:服务器会认为条件不满足(因为 * 匹配到了现有资源),从而返回 412 Precondition Failed(前提条件失败)。这防止了客户端无意中覆盖掉别人刚刚创建好的内容。

  • 如果资源不存在:服务器执行创建操作,返回 201 Created

evaluates condition

  1. false:
    • 取值:*
    • 当服务器有对应的target resources时
  2. false:
    • 取值:单个entity-tag/entity-tag 列表
    • 当服务器上当前对应的那个资源的etag没有和field中的etag匹配
  3. true:其他情况

evaluates与method执行

参考5. Evaluation

验证不通过时的处理必须(MUST)返回的code

304

当请求方法为GET/HEAD时,返回304。当返回304时,header以及body的限制参考4.1. 304 Not Modified

412

当请求为其他方法时返回412。rfc中并没有定义当返回412时response中其他部分的规则,参考4.2 Precondition Failed