我有一个方法,接收对象,并检查在数据库中,如果它存在。如果答案是肯定的,则更新该值,否则将在数据库中插入新记录。应该使用哪个- PUT或POST,因为在一种情况下,我正在更新记录,在另一个新的创建?
这种行为就是我们通常所说的"upserts",基本上就是插入一个不存在的项,否则更新该项。参考
关于你可以使用哪个http动词:
PUT和POST之间的区别在于PUT是幂等的:连续调用它一次或多次具有相同的效果(即没有副作用),而连续相同的POST请求可能具有额外的效果,类似于多次下订单。参考
话虽如此,upsert操作根据不同的情况有不同的效果,所以我认为POST
请求更合适,因为如果记录已经存在,它将返回一个200 OK
,表示记录已更新,如果它不存在,它将返回一个201 CREATED
,表示新记录已插入。
但这并不是一成不变的,我看到人们采用不同的方法,比如:
- 如果用户可以控制哪些属性将用于识别记录是否已经存在,那么upsert端点可能是
PUT
- 如果系统有自主权来决定哪个属性将被用来确定记录是否已经存在,那么upsert端点可能是
POST
项目#1的例子将是PUT /resource/identifier
,系统将获得identifier
并查看数据库中是否已经存在,如果存在则完全更新记录,如果不存在则插入一个新的记录,用提供的标识符标记它。
项目#2的例子是POST /resource
,用户不关心哪些属性将被用来确定记录的存在,它相信正确的操作将被执行,不管他发送了什么。