需要有关在node.js中构建RESTful API的最佳实践的一些指导
假设我有一个像这样的人物记录:
{
id: 1,
name: 'Jon',
age: 25,
recordVersion: 1
}
如果每次更改值时都需要增加recordVersion,我是否还会使用HTTP PUT来更新此记录?我已经研究了PUT应该如何是幂等的,并且应该包含原始资源的新更新表示,所以我不知道该怎么做。
我可以在第一个PUT调用时递增recordVersion属性,并在第二个PUT调用上发送错误,同一版本号为1(因为此时它会增加到2),但这是否遵循RESTful API标准?
答案 0 :(得分:1)
通过网络发送的资源是状态的表示,而不是实际状态。
删除recordVersion并在幕后更新它是完全没问题的 - 但是如果你这样做,最好将它从GET返回的表示中删除到该资源。要理解为什么:幂等性就是如果你连续多次应用这个操作会发生什么(不保证其他操作发生在...之间......)和可观察的副作用
幂等,因为两次调用PUT后资源表示没有改变,即使内部实体状态已经改变 - 没有可观察的副作用。
有关详细信息,请参阅http://restcookbook.com/HTTP%20Methods/idempotency/。
正如您所说,您可以使用检查版本并在错误发生时抛出错误 - 实际上这非常RESTful,并且在我看来是接近PUT的最佳方式,因为它有助于避免(通常是无法解释的)并发错误。如果您检测到这种情况,则返回409 Conflict http状态代码是合适的。
这是如何工作的:
v1 != v2
这是幂等的,因为调用操作两次没有可观察的副作用。
客户端应该响应409,进行另一次GET以获取最新版本代码,并可能向用户提供将其更改与其他更改同时合并的机会。
通常人们会将幂等性混淆为认为对操作的响应必须与多次调用的结果相同,但事实并非如此 - 它是由于多次顺序调用而没有可观察到的副作用。