我有一个对象:
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,对吗?
注意
我意识到我可以把它放在客户端上以获取所有交易并计算它,但我更愿意在服务器上执行此操作有多种原因
答案 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。