【问题标题】:How to create a RESTful object with server calculated fields如何使用服务器计算字段创建 RESTful 对象
【发布时间】:2013-09-18 19:56:07
【问题描述】:

我有一个对象:

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
....

我想我只是想看看是否已经有一个标准的方法来处理我所缺少的?

更新

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

注意

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

【问题讨论】:

    标签: http rest httpverbs idempotent


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我明白你的意思了。当有资格获得更多关注时,我将增加赏金。希望这只是对您所说的进行验证:)
    • 另外,我刚刚更新了我的问题,因为我遇到了最初让我想到这个思路的原因...更新帐户...我不能使用 PUT,必须使用 PATCH 或 POST (如果我保持原样)?
    • @JustinPihony 只要您在 PUT 中包含所有可以更新的属性,那么它仍然被视为完全替代。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      如果重要的是您能够 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 无法更新。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-24
        • 2012-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-10
        • 2014-10-12
        • 1970-01-01
        相关资源
        最近更新 更多