RESTful API的最佳实践,用于具有版本号的记录。我使用PUT吗?

时间:2016-08-23 23:28:29

标签: rest put restful-architecture

需要有关在node.js中构建RESTful API的最佳实践的一些指导

假设我有一个像这样的人物记录:

{ 
  id: 1,
  name: 'Jon',
  age: 25,
  recordVersion: 1
}

如果每次更改值时都需要增加recordVersion,我是否还会使用HTTP PUT来更新此记录?我已经研究了PUT应该如何是幂等的,并且应该包含原始资源的新更新表示,所以我不知道该怎么做。

我可以在第一个PUT调用时递增recordVersion属性,并在第二个PUT调用上发送错误,同一版本号为1(因为此时它会增加到2),但这是否遵循RESTful API标准?

1 个答案:

答案 0 :(得分:1)

Representation!= State

通过网络发送的资源是状态的表示,而不是实际状态。

删除recordVersion并在幕后更新它是完全没问题的 - 但是如果你这样做,最好将它从GET返回的表示中删除到该资源。要理解为什么:幂等性就是如果你连续多次应用这个操作会发生什么(不保证其他操作发生在...之间......)和可观察的副作用

  • 在没有版本的情况下输出数据
    • 数据已更新
    • 版本代码递增
    • 如果您进行了GET,您将获得PUT(没有版本)的数据
  • 在没有版本的情况下再次输出相同的数据
    • 数据已更新
    • 版本代码递增
    • 如果您进行了GET,您将获得与PUT相同的数据(没有版本)

幂等,因为两次调用PUT后资源表示没有改变,即使内部实体状态已经改变 - 没有可观察的副作用。

有关详细信息,请参阅http://restcookbook.com/HTTP%20Methods/idempotency/

使用版本代码检测冲突

正如您所说,您可以使用检查版本并在错误发生时抛出错误 - 实际上这非常RESTful,并且在我看来是接近PUT的最佳方式,因为它有助于避免(通常是无法解释的)并发错误。如果您检测到这种情况,则返回409 Conflict http状态代码是合适的。

这是如何工作的:

  • 使用版本(v1)输出数据
    • 数据已更新
    • 版本代码递增
    • 如果您进行了GET,您将获得使用 new 版本(v2)获得PUT的数据(这是副作用,但是可以使用第一次时间执行操作时的副作用。)
  • 再次使用版本(v1)输出相同的数据
      检测到
    • 冲突是因为v1 != v2
    • 409冲突已退回
    • 如果您进行了GET,您将获得与第一次操作相同的结果 - 您最初使用版本v2进行PUT的数据

这是幂等的,因为调用操作两次没有可观察的副作用。

客户端应该响应409,进行另一次GET以获取最新版本代码,并可能向用户提供将其更改与其他更改同时合并的机会。

通常人们会将幂等性混淆为认为对操作的响应必须与多次调用的结果相同,但事实并非如此 - 它是由于多次顺序调用而没有可观察到的副作用。

相关问题