本节摘要:HTTP 方法为每种资源操作分配标准动词:GET 读、POST 建、PUT 整体替换、PATCH 局部改、DELETE 删。本节的钥匙是"安全"与"幂等"两个词——安全指不产生副作用,幂等指重复执行结果一致。用这两个维度一张表能推演出所有方法的正确用法,还能处置 202、409、PUT 与 PATCH 边界这类复杂场景。
阅读完本节,你应当能够:
方法语义不需要背张表,只需要抓住两个核心概念,其余全都能推出来。
把五个方法的安全与幂等属性铺开看:
对应到表格更精确:
| 方法 | 安全 | 幂等 | 典型用途 | 边界情形 |
|---|---|---|---|---|
| GET | 是 | 是 | 读取资源、列表、详情 | 别用 GET 做删改副作用 |
| POST | 否 | 否 | 创建资源、触发非幂等动作 | 重复提交会产生重复资源 |
| PUT | 否 | 是 | 客户端指定 URI 的整体替换 | 也可用于"按整份替换创建" |
| PATCH | 否 | 通常是 | 只改其中几个字段 | 部分更新,语义要写清 |
| DELETE | 否 | 是 | 删除资源 | 二次删除同样让资源不存在 |
这是工程师最爱踩的边界之一。
举一个可运行的例子。用户资源现有字段是名字与邮箱。要改邮箱:
PUT /users/99 HTTP/1.1 Content-Type: application/json {"name":"Alice","email":"alice@new.com","phone":null}
PUT 要带齐整份表示(即便 phone 要清空也得显式给 null)。而 PATCH 只发要动的:
PATCH /users/99 HTTP/1.1 Content-Type: application/merge-patch+json {"email":"alice@new.com"}
同理,PUT 如果客户端只发了 email,服务器不该把它当成"只改邮箱",而应理解为"用这一份替换整个用户"——这正是两者最大的分歧点。POST 创建也是容易混淆处:POST 不指定 URI,服务器自建;PUT 指定 URI,幂等地放置。
现实接口常有"不是一次就成一件事"的动作,方法语义就要会牺牲。两个典型:
⚠️ 常见坑:拿 400 表达一切"客户端的问题"。一个具体方法是配合"请求幂等键"做重复提交防护:客户端带一个
Idempotency-Key头,服务器对同一 key 的重复 POST 返回首次结果而非再造一份。这让不幂等的 POST 在重试场景下变安全。
主方法之外的几个也别忽略:OPTIONS 让客户端获知资源支持哪些方法(CORS 预检也用它);HEAD 只回头部不回首体,用来探活;用法不多但"健康检查到底该用哪种请求"就有讲究。它们的共同点是"不改变资源状态",天然安全,幂等性也好,基本不会出治理事故。
💡 关键直觉:方法语义这一关,把"安全 + 幂等"二字吃透,就能回答八成"这里该用哪个方法"的疑问;剩下的二成,靠 202、409、幂等键这些补丁来兜。
补一句最容易被忽略的:安全与幂等是"语义承诺",不是"实现保证"。一个团队在 GET 里干了写库的脏活,从权限看它仍是"安全"的宣言,行为却不安全——这在并发与缓存下迟早翻车。方法选型必须与后台业务对齐:GET 的处理器里做了状态变更,就该承认是 POST 的职责,别仗着"能通"就把它钉在 GET 上。契约的动词只表达"承诺做什么",不做就是不守约。
动词分配完毕,接下来处理"请求自备干粮"的无状态条款——它决定了服务器能不能横向堆机器、扛并发。