首页 前端技术 正文
  • 本文约1091字,阅读需5分钟
  • 18
  • 0

PATCH与PUT的区别及使用场景

摘要

PATCH与PUT的区别及使用场景 HTTP方法 PATCH和 PUT都用于更新资源,但它们在语义和用法上有本质区别: 🔑 核心区别总结 特性 PUT PATCH 语义 替换整个资源 部分更新资源 客户端数据 必须提供资源的完整表示 只需提供要修改的字段 幂等性 ✅ 是(多次调用效果相同) ❌ 否(依赖补丁内容) 安全性 ❌ 非安全(修改资源) ❌ 非安全(...

PATCH与PUT的区别及使用场景

HTTP方法 PATCHPUT都用于更新资源,但它们在语义和用法上有本质区别:

🔑 核心区别总结

特性 PUT PATCH
语义 替换整个资源 部分更新资源
客户端数据 必须提供资源的完整表示 只需提供要修改的字段
幂等性 ✅ 是(多次调用效果相同) ❌ 否(依赖补丁内容)
安全性 ❌ 非安全(修改资源) ❌ 非安全(修改资源)
失败风险 更高(需传输完整资源) 更低(仅传增量)
典型场景 覆盖式更新(如替换文档) 局部更新(如修改状态、单个字段)

🛠 深入解析

  1. PUT - 整体替换

    • 要求客户端发送资源的完整表示
    • 服务器会用提供的数据完全替换目标资源(忽略现有状态)。
    • 幂等性:多次调用效果相同(例如重复上传同一文件结果不变)。
    • 示例

      PUT /users/123
      {
      "name": "Alice",
      "email": "alice@new.com",  // 必须包含所有字段
      "status": "active"
      }

      如果只传 email,其他字段会被置空!

  2. 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的清晰性和可维护性至关重要。

收藏



扫描二维码,在手机上阅读
    评论
    友情链接