2

我有一个对象:

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是通过补丁,因为我不能允许更新 CurrentBalance,对吗?

笔记

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

4

3 回答 3

6

幂等性并不意味着您必须始终得到相同的响应。

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

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

于 2013-09-15T00:52:26.507 回答
1

我只是重新阅读了HTTP 规范,并意识到如果我想真正做到,RESTful我必须进行多次调用,因为 GET 必须是安全的。

特别是,已经建立了约定,即 GET 和 HEAD 方法不应该具有采取除检索之外的操作的意义。

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

于 2013-09-14T04:01:45.667 回答
1

如果您能够 PUT 一些数据很重要,然后立即通过 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 无法更新。

于 2013-09-18T04:13:16.970 回答