一文详解五种常见请求 GET(查询)、POST(创建)、PUT(更新)、DELETE(删除)、PATCH(部分更新)的区别

19 阅读4分钟

GET、POST、PUT、DELETE、PATCH 五种 HTTP 请求方法在web 开发中经常碰到,下面我们将从涵盖语义、幂等性、安全性、参数位置、典型场景及代码示例等方向对它进行对比分析


1. GET(查询)

用途
• 获取资源(只读操作)。

• 示例:查询用户列表、获取商品详情。

特点
• 安全且幂等:不修改服务器数据,多次调用结果一致。

• 参数位置:通过 URL 的查询字符串(Query String)传递参数。

• 缓存友好:支持浏览器缓存和代理服务器缓存。

• 数据限制:URL 长度有限(通常约 2KB),不适合传输敏感或大量数据。

场景

GET /users       # 获取所有用户列表
GET /users/123   # 获取 ID 为 123 的用户信息

2. POST(创建)

用途
• 提交数据(通常用于创建资源或触发副作用操作)。

• 示例:用户注册、提交订单、发送邮件。

特点
• 不安全且不幂等:可能修改服务器数据,多次调用可能产生不同结果(如重复提交)。

• 参数位置:数据通过请求体(Request Body)传输,支持复杂结构(如 JSON、XML)。

• 无数据限制:适合传输大量或敏感数据。

• 响应:通常返回新资源的 URI 或状态码(如 201 Created)。

场景

POST /users      # 创建新用户
Body: { "name": "John", "age": 20 }
Response: 201 Created, Location: /users/123

3. PUT(全量更新)

用途
• 全量更新资源(替换整个资源)。

• 示例:更新用户的全部信息(需提供完整字段)。

特点
• 幂等:多次调用效果与一次相同(若数据相同)。

• 参数位置:数据通过请求体传输,必须包含完整资源信息。

• URI 明确:请求的 URI 必须指向具体资源(如 /users/123)。

场景

PUT /users/123   # 替换 ID 为 123 的用户全部信息
Body: { "name": "John", "age": 25 }

4. DELETE(删除)

用途
• 删除资源。

• 示例:删除用户账户、取消订单。

特点
• 幂等:多次调用效果与一次相同(删除后资源已不存在)。

• 无请求体:通常不需要请求体,仅需指定资源 URI。

场景

DELETE /users/123   # 删除 ID 为 123 的用户

5. PATCH(部分更新)

用途
• 部分更新资源(仅修改资源的部分字段)。

• 示例:更新用户的邮箱或地址(无需提交完整信息)。

特点
• 不幂等:多次调用可能产生不同结果(如多次部分更新)。

• 参数位置:数据通过请求体传输,仅包含需更新的字段。

• 灵活性:适合增量更新,减少数据传输量。

场景

PATCH /users/123   # 更新 ID 为 123 的用户邮箱
Body: { "email": "new@example.com" }

关键区别总结

方法语义幂等性安全性参数位置典型场景
GET查询URL 查询字符串获取数据
POST创建/触发操作请求体创建资源、提交表单
PUT全量更新请求体替换整个资源
DELETE删除URL删除资源
PATCH部分更新请求体修改资源的局部字段

补充说明

  1. 幂等性:
    • PUT 和 DELETE 是幂等的(多次调用结果一致)。

    • POST 和 PATCH 不幂等(多次调用可能产生不同结果)。

  2. 安全性:
    • GET 是安全的(不修改数据)。

    • 其他方法均不安全(可能修改数据)。

  3. RESTful 设计原则:
    • PUT 要求客户端提供完整资源数据,用于替换服务器端资源。

    • PATCH 用于增量更新,需明确指定需修改的字段(如 JSON Merge Patch 或 JSON Patch 格式)。

    • POST 通常用于“副作用”操作(如触发邮件发送、创建子资源)。

  4. 缓存与性能:
    • GET 可被缓存,适合高频读取场景。

    • PUT/DELETE 通常不缓存。


代码示例对比

# 创建用户(POST)
POST /users
Body: { "name": "John", "age": 20 }

# 全量更新用户(PUT)
PUT /users/123
Body: { "name": "John", "age": 25, "email": "john@example.com" }

# 部分更新用户(PATCH)
PATCH /users/123
Body: { "email": "new@example.com" }

# 删除用户(DELETE)
DELETE /users/123

通过合理使用 HTTP 方法,可以使 API 设计更符合语义、易于维护,并充分利用 HTTP 协议的特性(如缓存、幂等性)。