为了账号安全,请及时绑定邮箱和手机立即绑定

在REST中进行交易?

在REST中进行交易?

收到一只叮咚 2019-12-09 09:21:22
我想知道您如何在REST中实现以下用例。是否有可能在不损害概念模型的情况下做?在单个事务范围内读取或更新多个资源。例如,将$ 100从Bob的银行帐户转入John的帐户。据我所知,实现这一目标的唯一方法是作弊。您可以发布到与John或Bob关联的资源,并使用一个事务执行整个操作。就我而言,这破坏了REST架构,因为您实际上是通过POST来传送RPC调用的通道,而不是真正对单个资源进行操作。
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

考虑一个RESTful购物篮方案。从概念上讲,购物篮是您的事务包装器。您可以将多个项目添加到购物篮中,然后提交该购物篮来处理订单,方法与您可以将Bob的帐户条目添加到事务包装器中,然后将Bill的帐户条目添加到包装器中一样。当所有部件都放置到位后,您可以将所有组件部件进行POST / PUT事务包装。


查看完整回答
反对 回复 2019-12-09
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

有几个重要的问题没有被这个问题回答,我认为这太糟糕了,因为它在Google的搜索词中排名很高:-)


具体来说,一个不错的选择是:如果您两次发布(由于中间存储区中的某些高速缓存被打断),则不应两次进行转账。


为此,您将事务创建为对象。这可能包含您已经知道的所有数据,并使事务处于挂起状态。


POST /transfer/txn

{"source":"john's account", "destination":"bob's account", "amount":10}


{"id":"/transfer/txn/12345", "state":"pending", "source":...}

有了该事务后,就可以提交它,例如:


PUT /transfer/txn/12345

{"id":"/transfer/txn/12345", "state":"committed", ...}


{"id":"/transfer/txn/12345", "state":"committed", ...}

注意,在这一点上,多次认沽并不重要。甚至在txn上的GET都将返回当前状态。具体来说,第二个PUT会检测到第一个PUT已经处于适当的状态,然后将其返回-或者,如果在它已经处于“提交”状态之后尝试将其置于“回滚”状态,则会得到一个错误,并将实际的已提交事务退回。


只要与单个数据库或具有集成事务监控器的数据库进行对话,该机制实际上就可以正常工作。您可能还会引入事务超时,如果需要,甚至可以使用Expires标头表示。


查看完整回答
反对 回复 2019-12-09
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

用REST术语来说,资源是可以与CRUD(创建/读取/更新/删除)动词配合使用的名词。由于没有“转移资金”动词,因此我们需要定义一个可以使用CRUD进行操作的“交易”资源。这是HTTP + POX中的示例。第一步是创建(HTTP POST方法)一个新的空事务:


POST /transaction

这将返回交易ID,例如“ 1234”,并返回URL“ / transaction / 1234”。请注意,多次触发此POST不会创建具有多个ID的同一事务,并且还避免引入“待处理”状态。另外,POST不一定总是幂等的(REST要求),因此通常最好的做法是最小化POST中的数据。


您可以将事务ID的生成留给客户。在这种情况下,您可以POST / transaction / 1234创建事务“ 1234”,并且服务器将返回错误(如果已存在)。在错误响应中,服务器可以返回带有适当URL的当前未使用的ID。用GET方法向服务器查询新ID并不是一个好主意,因为GET绝不应更改服务器状态,而创建/保留新ID会更改服务器状态。


接下来,我们使用所有数据更新(PUT HTTP方法)事务,隐式提交:


PUT /transaction/1234

<transaction>

  <from>/account/john</from>

  <to>/account/bob</to>

  <amount>100</amount>

</transaction>

如果之前已对ID为“ 1234”的事务进行了PUT,则服务器将给出错误响应,否则将给出OK响应以及用于查看已完成事务的URL。


注意:在/ account / john中,“ john”应该确实是John的唯一帐号。


查看完整回答
反对 回复 2019-12-09
  • 3 回答
  • 0 关注
  • 481 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信