这将返回一个事务 ID,例如“1234”和相应的 URL“/action/1234”。请注意,多次触发此 POST 不会创建具有多个 ID 的相同事务,而且还可以避免引入“挂起”状态。另外,POST 不能总是幂等的(REST 需求) ,因此最小化 POST 中的数据通常是一个好的实践。
您可以将事务 ID 的生成留给客户端。在这种情况下,您可以使用 POST/action/1234来创建事务“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 来查看完成的事务。
下游服务。您开发的任何 Web 服务都将具有您所使用的下游服务,以及您别无选择只能遵循的事务语法。您应该尝试对您的服务的用户隐藏所有这些,并确保您的操作的所有部分作为一个组成功或失败,然后将这个结果返回给您的用户。
你的服务。客户希望对 Web 服务调用产生明确的结果,而通常的 REST 模式是直接对实质性资源发出 POST、 PUT 或 DELETE 请求,这种方式给我的印象是提供这种确定性的一种糟糕且容易改进的方式。如果您关心可靠性,则需要确定操作请求。这个 id 可以是在客户机上创建的 guid,也可以是来自服务器上的关系数据库的种子值,这无关紧要。对于服务器生成的 ID,使用“预起飞”请求-响应来交换操作的 ID。如果此请求失败或一半成功,没有问题,客户端只是重复该请求。没用过的身份证没有坏处。< br > < br > 这很重要,因为它允许所有后续请求完全幂等,也就是说,如果它们重复 n 次,它们返回相同的结果,并且不会导致进一步的事情发生。服务器根据动作 ID 存储所有响应,如果它看到相同的请求,它将重播相同的响应。在 这个谷歌文档中对该模式进行了更全面的处理。文档提出了一个实现,我相信(!),大致遵循 REST 原则。专家们肯定会告诉我它是如何侵犯他人的。无论是否涉及下游事务,这种模式都可以有效地用于对 Web 服务的任何不安全调用。
将您的服务集成到由上游服务控制的“事务”中。在 Web 服务的上下文中,完整的 ACID 事务通常被认为不值得付出努力,但是您可以通过在确认响应中提供取消和/或确认链接来极大地帮助服务的消费者,从而实现 补偿交易。