3 回答
TA贡献2003条经验 获得超2个赞
考虑一个RESTful购物篮方案。从概念上讲,购物篮是您的事务包装器。您可以将多个项目添加到购物篮中,然后提交该购物篮来处理订单,方法与您可以将Bob的帐户条目添加到事务包装器中,然后将Bill的帐户条目添加到包装器中一样。当所有部件都放置到位后,您可以将所有组件部件进行POST / PUT事务包装。
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标头表示。
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的唯一帐号。
- 3 回答
- 0 关注
- 481 浏览
添加回答
举报