2012-03-02 71 views
2

让我们考虑一下我需要开发一个REST银行应用程序,该应用程序允许创建/销毁银行帐户以及在帐户上执行以下操作: :withdraw/credit/getBalance。RESTful兼容设计

  • 创建一个帐户的

PUT /银行/约翰

这里我用PUT POST而不是因为这个操作是 幂和因为客户端是给的网址

  • 销毁账户

删除/银行/约翰

  • 为getBalance

GET /银行/约翰

  • 从账户提款

POST /银行/约翰

action =撤消&值= 10

  • 信贷资金的帐户

POST /银行/约翰

行动=信用&值= 10

在这里,我用POST因为撤/信贷显然不是幂等的

它是一种设计这些操作的RESTful兼容方式吗?

我感觉我正在写一些类似于RPC的东西,通过将动作参数放入 内部,我经常读到REST不应该模仿类RPC的风格。

+0

我认为你需要消除动作动词并完全依赖(尽可能)HTTP方法来说设计是REST。 – kosa 2012-03-02 21:34:15

回答

0

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

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

当然,它会工作...但据我了解的原则,你的解决方案也将打破这些原则... – jean 2012-03-02 23:11:01

1

当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 

这可能返回准确交易的记录(例如你的用户一般都希望借方和贷方对他们的账户的记录)。

+0

谢谢nategood。我必须承认,这种设计方式对我来说并不自然(我来自CORBA世界......),但我认为您的解决方案尊重REST架构原则。 – jean 2012-03-02 23:08:55

+0

您可能还希望有效存款和取款幂等(您希望交易发生两次)。这可以通过在“草稿”状态下创建事务并要求更新(PUT)提交来相当容易地完成。另外,为了使您的API成为真正的RESTful,您需要在响应中包含链接和表单。更多详情,请访问http://www.amundsen.com/blog/archives/1041 – 2012-03-04 21:36:55