1. 简介 (Introduction)
条件请求 (conditional requests) 是包含一个或多个头字段的 HTTP 请求 [RFC7231], 这些头字段指明在把方法语义应用到目标资源之前需要测试的前置条件. 本文档根据 [RFC7230] 中定义的架构, 语法表示法和一致性准则, 定义 HTTP/1.1 条件请求机制.
条件 GET 请求是 HTTP 缓存更新 [RFC7234] 最高效的机制. 条件也可以应用于会改变状态的方法, 例如 PUT 和 DELETE, 以防止 "lost update" 问题: 一个客户端意外覆盖另一个并行操作客户端的工作.
条件请求的前置条件基于目标资源整体的状态 (其当前值集合), 或者基于先前获取的某个表示中观察到的状态 (该集合中的一个值). 一个资源可以有多个当前表示, 每个表示都有自己的可观察状态. 条件请求机制假定, 如果服务器打算利用条件请求, 请求到 "选定表示" (selected representation, [RFC7231] 第 3 节) 的映射会随时间保持一致. 即便该映射不一致且服务器无法选择适当表示, 当前置条件求值为 false 时也不会造成危害.
本规范定义的条件请求前置条件 (第 3 节) 在适用于接收方时 (第 5 节), 按其优先顺序 (第 6 节) 进行求值.
1.1. 一致性和错误处理 (Conformance and Error Handling)
本文档中的关键词 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" 和 "OPTIONAL" 应按 [RFC2119] 中的描述解释.
一致性准则以及关于错误处理的考虑事项在 [RFC7230] 第 2.5 节中定义.
1.2. 语法表示法 (Syntax Notation)
本规范使用 [RFC5234] 的 Augmented Backus-Naur Form (ABNF) 表示法, 并采用 [RFC7230] 第 7 节定义的列表扩展. 该扩展允许使用 "#" 运算符紧凑地定义逗号分隔列表, 类似于 "*" 运算符表示重复的方式. 附录 B 描述从其他文档导入的规则. 附录 C 展示汇总后的语法, 其中所有列表运算符都已展开为标准 ABNF 表示法.