【问题标题】:RESTful compliant designRESTful 兼容设计
【发布时间】:2012-03-21 09:22:18
【问题描述】:

假设我需要开发一个 REST 银行应用程序 允许创建/销毁银行账户以及 对账户进行以下操作:withdraw/credit/getBalance。

  • 创建帐户

PUT /银行/约翰

这里我使用 PUT 而不是 POST 因为这个操作是 幂等并且因为客户端给出了URL

  • 帐户的销毁

删除/银行/约翰

  • 获取平衡

GET /银行/约翰

  • 从账户中取款

POST /银行/约翰

action=withdraw&value=10

  • 将钱存入帐户

POST /银行/约翰

action=credit&value=10

在这里,我使用了 POST,因为提款/信用显然不是幂等的

设计这些操作是否符合 RESTful 标准?

我感觉我正在写一些类似于 RPC 的东西,方法是把动词 (withdraw | credit) 放在里面 action 参数.. 我经常读到 REST 不应该模仿类似 RPC 的风格...

【问题讨论】:

  • 我认为您需要消除动作动词并完全(尽可能)依赖 HTTP 方法来说明设计是 REST。

标签: http rest post soa


【解决方案1】:

我认为你不应该添加“action=credit&value=10”的东西。您可以创建更多/更长的 URI。 例如:

create an account: POST /Bank/Accounts/John
credit money to an account: POST /Bank/John/Money/10

【讨论】:

  • 当然可以...但据我了解的原则,您的解决方案也会违反这些原则...
  • POST 用于存入资金。你会用什么来取钱?我想你可以发布一个负值。但这似乎有点奇怪。
【解决方案2】:

在处理 REST 时,通常从资源方面的思考开始会有所帮助。在这种情况下,您的资源不仅仅是您的“银行账户”,而是该银行账户的交易。

存款

POST /Bank/Account/John/Transaction

currency=USD&amount=10

退出

POST /Bank/Account/John/Transaction

currency=USD&amount=-10

您的响应应该在这个新创建的事务中包含一个Location 标头。

您正在创建交易。这样做的好处是您可以将该事务作为资源引用。

GET /Bank/Account/John/Transaction/12345

这可能会返回该确切交易的记录(例如,您的用户通常希望在他们的帐户上记录借记和贷记)。

【讨论】:

  • 感谢 nategood。我必须承认,这种设计方式对我来说并不自然(我来自 CORBA 世界......),但我认为您的解决方案尊重 REST 架构原则。
  • 您可能还希望使存款和取款有效地幂等(您希望交易发生两次)。这可以通过在“草稿”状态下创建事务并要求更新 (PUT) 提交来相当容易地完成。此外,为了让您的 API 真正成为 RESTful,您需要在响应中包含链接和表单。更多详情amundsen.com/blog/archives/1041
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2017-05-06
相关资源
最近更新 更多