HTTP 方法语义
GET 读取资源、POST 创建或提交、PUT 整体替换、PATCH 部分更新、DELETE 删除,方法的安全性与幂等性共同决定了重试、缓存与代理的处理方式:安全方法不改变服务端状态,幂等方法重复执行效果一致。统一这些语义,网关、缓存与重试中间件才能按预期工作,客户端也不必为每个接口单独约定重试规则。
方法与属性
| 方法 | 语义 | 安全 | 幂等 |
|---|---|---|---|
| GET | 读取资源 | 是 | 是 |
| HEAD | 读取响应头 | 是 | 是 |
| POST | 创建或提交,结果不确定 | 否 | 否 |
| PUT | 整体替换指定资源 | 否 | 是 |
| PATCH | 部分更新 | 否 | 视实现 |
| DELETE | 删除资源 | 否 | 是 |
基本信息
| 标准依据 | RFC 9110 定义了各方法的语义与属性 |
|---|---|
| 安全方法 | GET、HEAD、OPTIONS 不应产生副作用,可被缓存与预取 |
| 幂等方法 | GET、HEAD、PUT、DELETE 与部分 PATCH 实现 |
| 状态码配合 | 201 创建、204 无内容、409 冲突、412 前置条件失败 |
| 条件请求 | 用 ETag 与 If-Match 实现乐观并发控制 |
典型使用场景
- 接口设计评审:确认每个操作选用的方法与语义一致
- 重试策略制定:只对幂等方法自动重试,POST 需幂等键保护
- 缓存设计:只对安全且可缓存的响应设置缓存策略
- 乐观锁实现:用 ETag 与 If-Match 避免覆盖他人修改
- 网关与审计:按方法配置限流、鉴权和审计规则
- 前后端联调:明确创建与更新的语义差异,减少字段被清空的事故
PATCH 的幂等性取决于补丁语义:JSON Merge Patch(RFC 7396)是幂等的,而“余额加 10”这类增量式补丁不幂等,需要配合前置条件或幂等键。
用 GET 执行有副作用的操作,会被浏览器预取、爬虫或代理缓存触发意外写入,排查时极难复现。
状态码选择
| 场景 | 推荐状态码 | 说明 |
|---|---|---|
| 创建成功 | 201 | 响应头返回 Location 指向新资源 |
| 删除成功 | 204 | 无响应体,避免客户端误解析内容 |
| 乐观锁冲突 | 412 | If-Match 校验失败,应提示客户端重新获取 |
| 资源冲突 | 409 | 唯一约束或业务状态不允许当前操作 |
| 语义校验失败 | 422 | 语法正确但业务语义不合法 |
| 未认证与无权限 | 401 与 403 | 前者需要登录,后者已登录但无权限 |