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 | 部分更新 | 否 | 否 | 请求体 | 修改资源的局部字段 |
补充说明
-
幂等性:
• PUT 和 DELETE 是幂等的(多次调用结果一致)。• POST 和 PATCH 不幂等(多次调用可能产生不同结果)。
-
安全性:
• GET 是安全的(不修改数据)。• 其他方法均不安全(可能修改数据)。
-
RESTful 设计原则:
• PUT 要求客户端提供完整资源数据,用于替换服务器端资源。• PATCH 用于增量更新,需明确指定需修改的字段(如 JSON Merge Patch 或 JSON Patch 格式)。
• POST 通常用于“副作用”操作(如触发邮件发送、创建子资源)。
-
缓存与性能:
• 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 协议的特性(如缓存、幂等性)。