接口同时执行更新现有对象、创建新对象操作时应选用PUT还是POST?
问题结论:优先选择PUT,仅特殊场景使用POST
核心判断依据
HTTP请求方法的选择核心是匹配语义,而非单纯看操作是创建还是更新:
- PUT的语义是向指定的资源位置上传完整的资源状态,天然满足幂等性:同一个请求调用任意次,最终服务端的资源状态都和调用一次完全一致。RFC 7231规范明确允许PUT用于创建资源:只要请求的URI对应的资源不存在,且服务端允许请求方自定义该URI的资源,就可以通过PUT完成新资源创建。
- POST的语义是向资源集合提交数据,由服务端处理请求逻辑,不保证幂等性,通常用于请求方无法提前确定资源唯一标识、由服务端生成资源ID的场景。
适配你场景的选择建议
选PUT的情况
如果你的接口满足以下两个条件,直接用PUT即可:
- 请求的URI直接指向资源的唯一标识,比如
/employees/{employee_id},employee_id由请求方提供,服务端就是用这个ID判断资源是否存在 - 接口逻辑仅做资源的更新/插入,没有额外副作用(比如多次调用不会重复触发消息推送、流水生成等操作),完全符合幂等要求
你的upsert逻辑完全符合PUT的语义覆盖范围,不存在不符合规范的问题。
选POST的情况
只有出现以下任意一种情况时,才适合用POST:
- 资源的唯一标识由服务端生成(比如用数据库自增ID、服务端生成的UUID作为主键),请求方调用接口时无法提前确定资源的URI,只能提交到集合路径比如
/employees - 接口除了upsert资源外还有其他非幂等的副作用,多次调用会产生重复的业务影响
常见误区提醒:很多开发者误以为PUT只能做更新操作,这是对HTTP规范的错误理解,PUT完全支持「存在则更新、不存在则创建」的upsert场景。
内容的提问来源于stack exchange,提问作者Deyvid Dimitrov
相关产品推荐
相关产品推荐

