GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS对比。含幂等性、安全性和RESTful API设计指南。
| 方法 | 用途 | 安全性 | 幂等性 | 请求体 | 缓存 |
|---|---|---|---|---|---|
| GET | 获取资源 | ✅ 安全 | ✅ 幂等 | ❌ 无 | ✅ 可缓存 |
| POST | 创建资源 | ❌ 不安全 | ❌ 不幂等 | ✅ 有 | ❌ 不缓存 |
| PUT | 替换资源 | ❌ 不安全 | ✅ 幂等 | ✅ 有 | ❌ 不缓存 |
| PATCH | 部分更新 | ❌ 不安全 | ⚠️ 不保证 | ✅ 有 | ❌ 不缓存 |
| DELETE | 删除资源 | ❌ 不安全 | ✅ 幂等 | 可选 | ❌ 不缓存 |
| HEAD | 获取头信息 | ✅ 安全 | ✅ 幂等 | ❌ 无 | ✅ 可缓存 |
| 预检请求 | ✅ 安全 | ✅ 幂等 | ❌ 无 | ❌ 不缓存 |
GET:参数在URL查询字符串中(?key=value),有长度限制(浏览器约2KB),可被缓存和收藏,不应修改服务器状态。
POST:参数在请求体中,无长度限制,不可缓存,用于提交敏感数据(密码、文件上传),可修改服务器状态。
安全性:GET参数会出现在浏览器历史记录和服务器日志中,不适合传密码。POST相对安全但仍需HTTPS加密。
PUT:完整替换资源。如果资源不存在则创建。必须发送所有字段,缺失的字段会被置空。
PATCH:只更新指定的字段,其他字段保持不变。适合"修改用户昵称"这种部分更新场景。
示例:用户{name:"张三", age:25}更新name为"李四"——PUT需要发送{name:"李四", age:25},PATCH只需发送{name:"李四"}。
幂等性指同一个请求执行一次和执行多次的效果相同。GET是幂等的(多次获取同一资源结果一样),POST不是幂等的(多次提交会创建多条数据)。DELETE是幂等的(删除同一个资源,第一次删除成功,第二次返回404,但服务器状态没变)。
| 操作 | 方法 | URL | 说明 |
|---|---|---|---|
| 获取列表 | GET | /api/users | 返回用户列表 |
| 获取单个 | GET | /api/users/123 | 返回单个用户 |
| 创建 | POST | /api/users | 请求体含用户信息 |
| 全量更新 | PUT | /api/users/123 | 请求体含完整用户信息 |
| 部分更新 | PATCH | /api/users/123 | 请求体含修改的字段 |
| 删除 | DELETE | /api/users/123 | 删除指定用户 |
Q: GET和POST有什么区别?
A: GET参数在URL中,有长度限制,可缓存,幂等,用于获取数据。POST参数在请求体中,无长度限制,不可缓存,不幂等,用于提交数据。
Q: 为什么OPTIONS请求叫预检请求?
A: 浏览器在发送跨域请求时,如果请求不是简单请求(如PUT/DELETE或带自定义Header),会先发OPTIONS请求询问服务器是否允许,这个过程叫预检(Preflight)。