HTTP 方法语义

GET 读取、POST 创建、PUT 整体替换、PATCH 部分更新、DELETE 删除;方法与安全/幂等属性共同决定重试与缓存行为,是一致接口语义的基础。

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无响应体,避免客户端误解析内容
乐观锁冲突412If-Match 校验失败,应提示客户端重新获取
资源冲突409唯一约束或业务状态不允许当前操作
语义校验失败422语法正确但业务语义不合法
未认证与无权限401 与 403前者需要登录,后者已登录但无权限

易错点

  • 用 GET 执行有副作用的操作,被预取或缓存时产生意外数据变更
  • 把 PUT 当 PATCH 用,请求未提供的字段被清空
  • 对 POST 进行无幂等键的自动重试,产生重复订单或重复扣款
  • 所有响应统一返回 200 加错误字段,网关与缓存无法按语义处理
  • 更新接口不做前置条件校验,并发修改互相覆盖且无法察觉

数据来源与参考

  • RFC 9110 HTTP Semantics(第 9 章方法定义)
  • RFC 7396:JSON Merge Patch
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌