【问题标题】:Is it RESTful to have PUT request overwrite record with different primary key?让 PUT 请求用不同的主键覆盖记录是 RESTful 吗?
【发布时间】:2017-09-18 18:31:57
【问题描述】:

我的 PostgreSQL 数据库中有一个 user 表,其中包含这一行:

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

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

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

{ 
  name: 'unique name here'
} 

如果具有相同的名称,它将删除 1id 的行,并使用 upsert 函数创建具有 id2 的行。

使用 RESTful 架构,这是否合适,或者是否应该单独保留数据库并且服务器返回类似409 的状态代码,指示由于与目标资源的当前状态冲突而无法完成请求。

【问题讨论】:

    标签: postgresql rest server routes restful-architecture


    【解决方案1】:

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

    但是,删除旧主键并使用新主键创建新主键对我来说感觉像是一种奇怪的实现。 请记住,遵循 RESTful 设计准则并不能保证您最终会合理地实现您的服务器应用程序!这取决于您。

    当然,如果不知道您的应用程序的详细信息,就不可能确定最好的方法是什么,但我认为我倾向于禁止此请求 - 让客户端对正确的 URI 执行 PUT。

    不过,关于状态代码的一句话:从您的问题中不清楚 users/2 是否已在此示例中存在。正如您所说,409 表示与资源的 当前状态 发生冲突,因此不适合拒绝创建新资源的请求。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 2021-01-29
      • 2014-07-24
      相关资源
      最近更新 更多