HTTP中POST和PUT的区别
技术背景
在HTTP协议里,POST和PUT是常用的请求方法,二者均可用于创建资源,但在实际运用中存在明显差异。了解它们的区别,对设计RESTful API十分关键。
实现步骤
资源创建
- PUT:当客户端知晓要创建资源的URL时采用。客户端需指定资源的新URL,若该URL对应的资源已存在,则将其替换;若不存在,则创建新资源。
1
| PUT /resources/<newResourceId> HTTP/1.1
|
- POST:当客户端不知晓资源的URL,期望服务器来确定时使用。通常服务器会返回新资源的URL。
1
| POST /resources HTTP/1.1
|
资源更新
- PUT:可用于更新已有资源。客户端指定资源的URL,服务器把该资源替换为请求中包含的新状态。
1
| PUT /resources/<existingResourceId> HTTP/1.1
|
核心代码
PUT示例
1 2 3 4 5
| PUT /questions/<new_question> HTTP/1.1 Host: www.example.com/
PUT /questions/<existing_question> HTTP/1.1 Host: www.example.com/
|
POST示例
1 2
| POST /questions HTTP/1.1 Host: www.example.com/
|
最佳实践
- 若客户端能确定资源的URL,优先选用PUT,因其具备幂等性,多次请求不会产生额外影响。
- 若需服务器控制资源URL的生成,就使用POST。
- 若要更新资源,建议用PUT替换整个资源;若仅更新部分资源,可考虑使用PATCH方法。
常见问题
POST和PUT的幂等性问题
- PUT:具有幂等性,多次执行相同的PUT请求,资源状态保持不变。例如
x = 5
,多次执行结果相同。 - POST:不具备幂等性,多次执行相同的POST请求,可能会创建多个资源。例如
x++
,每次执行结果不同。
选择POST还是PUT来创建资源
- 若客户端能提供正确、规范且符合URL方案的URL,可使用PUT。
- 若无法完全信任客户端提供的URL,使用POST创建新资源,再由服务器在响应中返回URL。
POST请求丢失的情况
若POST消息丢失,系统状态将无法确定,无法自动恢复。而PUT消息在首次重试成功前,状态才不确定。所以,对于像信用卡交易这类对可靠性要求高的操作,不建议使用POST。