猿问

在REST中进行交易?

我想知道您如何在REST中实现以下用例。是否有可能在不损害概念模型的情况下做?

在单个事务范围内读取或更新多个资源。例如,将$ 100从Bob的银行帐户转入John的帐户。

据我所知,实现这一目标的唯一方法是作弊。您可以发布到与John或Bob关联的资源,并使用一个事务执行整个操作。就我而言,这破坏了REST架构,因为您实际上是通过POST来传送RPC调用的通道,而不是真正对单个资源进行操作。


收到一只叮咚
浏览 482回答 3
3回答

湖上湖

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

幕布斯7119047

有几个重要的问题没有被这个问题回答,我认为这太糟糕了,因为它在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标头表示。

牛魔王的故事

用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>&nbsp; <from>/account/john</from>&nbsp; <to>/account/bob</to>&nbsp; <amount>100</amount></transaction>如果之前已对ID为“ 1234”的事务进行了PUT,则服务器将给出错误响应,否则将给出OK响应以及用于查看已完成事务的URL。注意:在/ account / john中,“ john”应该确实是John的唯一帐号。
随时随地看视频慕课网APP
我要回答