PUT
方法是 HTTP 协议中定义的重要请求方法,主要用于 更新或替换服务器上的现有资源。以下是它的主要用途和特点:
🔧 核心用途
资源完整更新
- 替换指定 URI 对应的 整个资源
- 客户端需提供完整的更新后资源表示
- 示例:更新用户信息
PUT /users/123 { "name": "李四", "email": "lisi@example.com", "role": "admin" }
创建资源(特定场景)
- 当客户端明确知道资源 URI 时,可创建新资源
- 示例:创建 ID 已知的文章
PUT /articles/2023-ai-trends { "title": "2023 AI 趋势", "content": "..." }
🔄 与 POST/PATCH 的对比
方法 | 用途 | 幂等性 | 请求体要求 |
---|---|---|---|
PUT | 替换/创建整个资源 | ✅ 是 | 完整资源对象 |
PATCH | 部分更新资源 | ❌ 否 | 仅需修改的字段 |
POST | 创建新资源(服务端生成ID) | ❌ 否 | 新资源数据 |
💡 幂等性:多次调用 PUT 产生相同效果(重要特性!)
🧩 RESTful API 设计规范
在 REST 架构中,PUT 的标准用法:
// 更新用户接口设计
router.put('/users/:id', (req, res) => {
const user = User.update(req.params.id, req.body) // 替换整个资源
res.json(user)
})
// 前端调用示例(Vue + Axios)
async updateUser() {
const response = await this.$http.put(`/users/${this.userId}`, {
name: "王五",
age: 30,
department: "技术部"
})
}
⚠️ 使用注意事项
必须包含完整资源
若只提供部分字段,未提供的字段可能被置为null
URI 需指向具体资源
正确:PUT /products/123
错误:PUT /products/update
更新前校验
推荐使用If-Match
头防止覆盖冲突:PUT /document/1 If-Match: "e2d8c7a3" Content-Type: application/json {...}
🛡️ 安全性考虑
严格验证输入数据
// 服务端校验示例 if (!isValid(req.body)) { return res.status(400).json({ error: "无效数据" }) }
权限控制
// 检查当前用户是否有权修改目标资源 if (req.user.id !== req.params.id) { return res.status(403).end() }
🌐 实际应用场景
用户管理系统
- 更新用户资料
- 修改账户设置
内容管理系统
- 替换整篇文章内容
- 更新产品详情
配置系统
- 修改系统全局设置
- 更新设备参数
文件存储
- 替换云存储中的文件
PUT /files/report.pdf Content-Type: application/pdf [二进制文件数据]
💡 最佳实践
// 前端封装示例 (基于axios)
const api = {
async updateResource(url, data) {
try {
const res = await axios.put(url, data, {
headers: {
'Content-Type': 'application/json',
'If-Match': getETag() // 乐观锁控制
}
})
return res.data
} catch (err) {
if (err.response.status === 412) {
showAlert('数据已被他人修改,请刷新后重试')
}
throw err
}
}
}
// 使用示例
api.updateResource('/api/products/789', {
name: "新款手机",
price: 3999,
stock: 100
})
📌 关键点:PUT 的核心思想是 “替换” 而非 “修改”,适合需要原子性更新的场景。对于局部更新,优先考虑 PATCH 方法。