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 创建:

POST2

后来,保险箱被转租给另一位出租人,代理使用 PUT 方法更新整个出租人信息:

PUT2

⚠️ 注意:PUT 请求必须包含完整的资源数据,而不是部分字段。适用于需要完全替换资源的场景。

4. PATCH 方法详解

PATCH 方法用于对资源进行局部更新。 它的语义是“修改资源的部分字段”。

PATCH 的行为如下:

✅ 仅修改指定字段
✅ 操作是原子性的:要么全成功,要么全失败
✅ 成功时返回 204 No Content 或 200 OK
❌ 失败时返回错误码

使用场景示例

继续上面的例子,假设出租人只是修改了邮箱地址,代理使用 PATCH 方法仅更新邮箱字段:

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 替换整个资源(不符合语义)

原始标题:HTTP: Differences Between PUT and PATCH