PATCH与PUT的区别及使用场景
PATCH与PUT的区别及使用场景
HTTP方法 PATCH
和 PUT
都用于更新资源,但它们在语义和用法上有本质区别:
🔑 核心区别总结
特性 | PUT | PATCH |
---|---|---|
语义 | 替换整个资源 | 部分更新资源 |
客户端数据 | 必须提供资源的完整表示 | 只需提供要修改的字段 |
幂等性 | ✅ 是(多次调用效果相同) | ❌ 否(依赖补丁内容) |
安全性 | ❌ 非安全(修改资源) | ❌ 非安全(修改资源) |
失败风险 | 更高(需传输完整资源) | 更低(仅传增量) |
典型场景 | 覆盖式更新(如替换文档) | 局部更新(如修改状态、单个字段) |
🛠 深入解析
-
PUT - 整体替换
- 要求客户端发送资源的完整表示。
- 服务器会用提供的数据完全替换目标资源(忽略现有状态)。
- 幂等性:多次调用效果相同(例如重复上传同一文件结果不变)。
-
示例:
PUT /users/123 { "name": "Alice", "email": "alice@new.com", // 必须包含所有字段 "status": "active" }
如果只传
email
,其他字段会被置空!
-
PATCH - 局部更新
- 只需发送要修改的字段(通过JSON Patch、JSON Merge Patch等格式)。
- 服务器仅更新指定字段,保留其他字段不变。
- 非幂等:连续发送相同补丁可能产生不同结果(如依赖当前状态)。
-
示例(JSON Merge Patch):
PATCH /users/123 { "email": "alice@new-domain.com" // 仅修改邮箱 }
其他字段(如
name
,status
)保持不变。
⚠️ 关键注意事项
- 误用PUT的风险:若用PUT只传部分字段,服务器可能将缺失字段视为
null
,导致数据丢失。 - PATCH的格式要求:必须明确指定使用的补丁格式(如
Content-Type: application/merge-patch+json
),否则可能解析错误。 -
服务端实现:
PUT
需验证整个资源状态。PATCH
需解析补丁指令并处理部分更新逻辑(更复杂)。
� 何时使用?
方法 | 适用场景举例 |
---|---|
PUT | 用户上传完整配置文件替换整个文档内容重置资源状态 |
PATCH | 修改用户邮箱/手机号更新订单状态(如 /orders/456 { "status": "shipped" } )增量调整库存数量 |
📊 决策流程图
graph TD
A[需要更新资源] --> B{客户端是否有完整资源?}
B -->|是| C[用PUT]
B -->|否| D{只需更新部分字段?}
D -->|是| E[用PATCH]
D -->|否| F[重新设计请求]
💎 总结
- 用
PUT
:当你需要完全覆盖资源,且客户端持有完整最新表示时。 - 用
PATCH
:当你只需修改个别字段,或资源较大不想传输冗余数据时。
始终根据操作语义而非技术便利性选择方法,这对API的清晰性和可维护性至关重要。