如何使用服务器计算字段创建RESTful对象

时间:2013-09-14 03:30:25

标签: http rest httpverbs idempotent

我有一个对象:

Account
{
    Id,
    Name,
    CurrentBalance
}

Id是一个不可变密钥,Name是一个可变字符串,CurrentBalance是从与该帐户关联的所有事务计算出来的。

我坚持认为GET \Accounts\{Id}不会是幂等的,因为对事务的更改会导致CurrentBalance发生变化。我应该从对象中删除此字段并发出类似

的请求
POST \Accounts\{Id}\CurrentBalance

但是现在我必须多次调用服务器来获取所有对象的CurrentBalance

GET \Accounts
POST \Accounts\{Id1}\CurrentBalance
POST \Accounts\{Id2}\CurrentBalance
POST \Accounts\{Id3}\CurrentBalance
....

我想我只是想看看是否已经有一种标准方法可以解决这个问题,我错过了?

更新

第2部分,如果原始对象通过GET正常。我更新Account.Name的唯一方法是通过PATCH,因为我不能允许更新到CurrentBalance,对吗?

注意

我意识到我可以把它放在客户端上以获取所有交易并计算它,但我更愿意在服务器上执行此操作有多种原因

3 个答案:

答案 0 :(得分:6)

幂等性并不意味着您必须始终获得相同的回复。

考虑资源/TodaysWeather。如果它总是返回相同的值,那将毫无用处。

Idempotency简单地说明,如果客户多次发出相同的请求而不是一次,那么对系统的影响(从客户的角度来看)将是相同的。

答案 1 :(得分:1)

我刚刚重新阅读HTTP specs,并意识到如果我想成为真正的RESTful,我必须进行多次通话,因为GET必须是安全的。

  

特别是,已经建立了GET和GET的惯例   HEAD方法不应该具有采取行动的意义   除了检索。

我不是删除这个问题,因为我认为它可以在将来帮助其他人,但如果大多数人不同意我将删除它

答案 2 :(得分:1)

如果您能够输出一些数据很重要,那么可以通过GET立即检索相同的数据,然后您可以完全将其视为不同的资源,例如:

# Change an account name
PUT \Accounts\{id}

# Get accounts/names/balances
GET \AccountDetails

# Get balance of an account
GET \AccountDetails\{id}\CurrentBalance

然而,真的没有理由去解决这个问题。只要多次发出相同的请求不会改变系统的状态,您的PUT就是幂等的。 如果提交了某些虚假值,则更改系统的状态是正确的行为。事实上,如果有人尝试使用包含CurrentBalance的PUT,您可能希望返回400(错误请求)状态,说明无法更新CurrentBalance。