首先,转账是您在单个资源调用中无法完成的事情。您要做的操作是汇款。因此,您将汇款资源添加到发件人的帐户中。
POST: accounts/alice, new Transfer {target:"BOB", abmount:100, currency:"CHF"}.
完成。您不需要知道这是一个必须是原子的交易等。您只需转移资金。从 A 向 B 汇款。
但对于罕见的情况,这里有一个通用的解决方案:
如果您想在定义的上下文中执行涉及许多资源的非常复杂的事情,并且有很多限制实际上跨越了什么与为什么的障碍(业务与实施知识),您需要转移状态。由于 REST 应该是无状态的,因此您作为客户端需要转移状态。
如果您传输状态,您需要向客户端隐藏内部信息。客户不应知道仅执行所需的内部信息,但不携带与业务相关的信息。如果这些信息没有商业价值,则应加密状态并使用令牌、通行证等隐喻。
这种方式可以传递内部状态,并且使用加密和签名系统仍然可以安全可靠。为客户找到正确的抽象为什么要传递状态信息取决于设计和架构。
真正的解决方案:
请记住,REST 是在谈论 HTTP,而 HTTP 带有使用 cookie 的概念。当人们谈论跨越多个资源或请求的 REST API 和工作流和交互时,这些 cookie 经常被遗忘。
记住维基百科中关于 HTTP cookie 的内容:
Cookie 旨在成为网站记住状态信息(例如购物车中的商品)或记录用户浏览活动(包括单击特定按钮、登录或记录用户访问了哪些页面)的可靠机制。用户早在几个月或几年前)。
所以基本上如果您需要传递状态,请使用 cookie。它的设计目的完全相同,它是 HTTP,因此它在设计上与 REST 兼容 :)。
更好的解决方案:
如果您谈论客户端执行涉及多个请求的工作流,您通常会谈论协议。每种形式的协议都为每个潜在步骤都附带了一组先决条件,例如在执行步骤 A 之前执行步骤 B。
这是很自然的,但向客户端公开协议会使一切变得更加复杂。为了避免它,只要想想我们在现实世界中必须进行复杂的交互和事情时会做什么......我们使用代理。
使用代理隐喻,您可以提供一种资源,该资源可以为您执行所有必要的步骤,并将其所执行的实际分配/指令存储在其列表中(因此我们可以在代理或“代理”上使用 POST)。
一个复杂的例子:
买房:
您需要证明您的可信度(例如提供您的警察记录条目),您需要确保财务细节,您需要使用律师和受信任的第三方存储资金购买实际房屋,验证房屋现在属于给您并将购买的东西添加到您的税务记录等中(例如,某些步骤可能是错误的或其他)。
这些步骤可能需要几天才能完成,有些可以并行完成,等等。
为了做到这一点,你只需给代理买房子的任务,比如:
POST: agency.com/ { task: "buy house", target:"link:toHouse", credibilities:"IamMe"}.
完成。该机构会向您发回一份参考资料,您可以使用该参考资料查看和跟踪该工作的状态,其余工作由该机构的代理人自动完成。
例如考虑一个错误跟踪器。基本上,您报告错误并可以使用错误 ID 来检查发生了什么。你甚至可以使用服务来监听这个资源的变化。任务完成。