1. 简介
HTTP(Hypertext Transfer Protocol)是一种广泛使用的通信协议,自 90 年代起就被用于构建分布式超媒体信息系统。HTTP 提供了多种标准方法,这些方法具有不同的属性和用途,开发者在设计 HTTP 接口时需要仔细理解并合理使用。
其中,PUT 和 PATCH 方法的功能非常相似,但并不相同。本文将详细介绍这两个方法的定义、使用场景以及它们之间的关键区别。
2. HTTP 方法概述
HTTP 是一种应用层协议,客户端和服务器通过它进行通信和数据交换。 它运行在 TCP/IP 协议栈之上,采用请求/响应模型:客户端发送请求,服务器响应请求。
一个 HTTP 请求包含请求方法、URI、可选的请求头和请求体。服务器返回状态码和响应体。
2.1. 常见 HTTP 方法简介
HTTP 1.1 定义了 9 个标准方法(其中 8 个在 RFC 7231 中定义,1 个 PATCH 在 RFC 5789 中定义):
- GET:获取资源信息
- POST:创建资源
- PUT:更新资源(替换整个资源)
- DELETE:删除资源
- HEAD:获取响应头,不返回响应体
- OPTIONS:获取服务器对资源支持的方法
- TRACE:回显请求内容,用于调试
- CONNECT:建立隧道连接(如 HTTPS)
- PATCH:部分更新资源
2.2. 方法的两个关键属性
- 安全性(Safe):方法是否不会对服务器状态造成影响。GET、HEAD、OPTIONS 是安全方法。
- 幂等性(Idempotent):多次调用该方法对服务器的影响是否与一次调用一致。GET、HEAD、PUT、DELETE、OPTIONS、TRACE 是幂等的。
3. PUT 方法详解
PUT 方法用于将客户端提供的完整资源数据发送给服务器。 它的语义是“替换整个资源”。
PUT 的行为如下:
✅ 如果资源不存在,服务器创建它,返回 201 Created
✅ 如果资源存在,服务器替换它,返回 200 OK 或 204 No Content
❌ 如果出错,通常返回 4xx 或 5xx 错误码
使用场景示例
假设我们正在注册一个保险箱的出租人信息。首次注册时,使用 POST 创建:
后来,保险箱被转租给另一位出租人,代理使用 PUT 方法更新整个出租人信息:
⚠️ 注意:PUT 请求必须包含完整的资源数据,而不是部分字段。适用于需要完全替换资源的场景。
4. PATCH 方法详解
PATCH 方法用于对资源进行局部更新。 它的语义是“修改资源的部分字段”。
PATCH 的行为如下:
✅ 仅修改指定字段
✅ 操作是原子性的:要么全成功,要么全失败
✅ 成功时返回 204 No Content 或 200 OK
❌ 失败时返回错误码
使用场景示例
继续上面的例子,假设出租人只是修改了邮箱地址,代理使用 PATCH 方法仅更新邮箱字段:
⚠️ 注意:PATCH 只需提供要修改的字段,其余字段保持不变。适用于局部更新的场景。
5. PUT 与 PATCH 的对比
特性 | PUT | PATCH |
---|---|---|
请求体(Body) | ✅ 必须有 | ✅ 必须有 |
响应体(Body) | ❌ 不应有 | ✅ 可以有 |
安全性(Safe) | ❌ 不安全 | ❌ 不安全 |
幂等性(Idempotent) | ✅ 支持 | ❌ 不支持 |
使用建议
- ✅ 使用 PUT:当你需要完全替换资源,且客户端能提供完整数据时
- ✅ 使用 PATCH:当你只需要修改资源的部分字段,避免不必要的数据传输
踩坑提醒
- ❌ 不要误用 PUT 做局部更新:会导致未指定字段被清空
- ❌ 不要误用 PATCH 做完整替换:不符合语义,也容易出错
6. 总结
本文深入探讨了 HTTP 协议中 PUT 和 PATCH 方法的定义、行为和使用场景。
- PUT:用于替换整个资源,幂等
- PATCH:用于局部更新资源,非幂等
在设计 RESTful API 时,选择合适的 HTTP 方法可以提升接口的语义清晰度和系统的健壮性。正确使用 PUT 和 PATCH,有助于避免数据丢失和接口误用。
✅ 最佳实践建议:
- 用 PUT 替换完整资源
- 用 PATCH 更新部分字段
- 不要用 PUT 更新部分字段(除非你清楚后果)
- 不要用 PATCH 替换整个资源(不符合语义)