使用不同的主键让PUT请求覆盖记录是RESTful吗?

时间:2017-09-18 18:31:58

标签: postgresql rest server routes restful-architecture

我的情况是,在我的PostgreSQL数据库中,我有一个user表,其中包含以下行:

{ 
  id: 1
  name: 'unique name here'
} 

其中id是主键,name具有唯一约束。

如果我要向连接到此数据库的服务器发出PUT /users/2请求,并且请求有效负载如下:

{ 
  name: 'unique name here'
} 

具有相同名称,它会删除id 1的行,并使用upsert函数创建id 2行。

使用RESTful架构,这是正确的还是应该保留数据库并且服务器返回类似409的状态代码,表明由于与目标资源的当前状态冲突而无法完成请求

1 个答案:

答案 0 :(得分:0)

就RESTfulness而言,没有什么可以禁止PUT覆盖现有数据和/或产生副作用(只要它当然是幂等的),以及有关底层数据的实现细节在REST的范围之外,所以从这个意义上讲,你提出的任何解决方案都可以。

然而,删除旧的并使用新的主键创建一个新的感觉对我来说感觉就像一个奇怪的实现。 请注意,遵循RESTful设计指南并不能保证您最终能够合理地实施服务器应用程序!这取决于您。

当然,在不知道申请细节的情况下,无法确定最佳方式是什么,但我认为我倾向于拒绝这一要求 - 让客户做一个PUT到正确的URI。

关于状态代码的说法:如果在此示例中已存在users / 2,则无法从您的问题中清除。如您所说,409表示与资源的当前状态冲突,因此它不适合拒绝创建新资源的请求。

我认为在这种情况下我会使用400 Bad Request或403 Forbidden。