まず、送金は、1回のリソース呼び出しで実行できないことではありません。あなたがしたい行動は送金です。したがって、送金者のアカウントに送金リソースを追加します。
POST: accounts/alice, new Transfer {target:"BOB", abmount:100, currency:"CHF"}.
できました。これはアトミックである必要があるトランザクションであることを知る必要はありません。単に送金を別名で行うだけです。AからBに送金します。
しかし、ここではまれなケースの一般的な解決策:
定義されたコンテキストで多くのリソースを必要とする非常に複雑なことをしたい場合は、実際にwhatとwhyの障壁(ビジネスと実装の知識)を越える多くの制限があり、状態を転送する必要があります。RESTはステートレスである必要があるため、クライアントとしての状態を転送する必要があります。
状態を転送する場合、内部の情報をクライアントから隠す必要があります。クライアントは、実装にのみ必要な内部情報を知っているべきではありませんが、ビジネスの観点から関連する情報を持ちません。これらの情報にビジネス上の価値がない場合は、状態を暗号化し、トークン、パスなどのメタファーを使用する必要があります。
このようにして、内部状態を渡し、暗号化と署名を使用して、システムを安全かつ確実にすることができます。クライアントが状態情報を渡す理由をクライアントに適切に抽象化することは、設計とアーキテクチャ次第です。
実際のソリューション:
RESTはHTTPを話し、HTTPにはCookieを使用するという概念が付属していることを思い出してください。それらのCookieは、人々がREST APIとワークフロー、および複数のリソースまたはリクエストにまたがる相互作用について話すとき、しばしば忘れられます。
ウィキペディアでHTTP Cookieについて書かれていることを思い出してください。
Cookieは、Webサイトがステートフルな情報(ショッピングカート内のアイテムなど)を記憶したり、ユーザーの閲覧アクティビティ(特定のボタンのクリック、ログイン、ユーザーがアクセスしたページの記録など)を記録したりするための信頼できるメカニズムとして設計されました数か月または数年前に戻します)。
したがって、基本的に状態を渡す必要がある場合は、Cookieを使用します。それはまったく同じ理由で設計されています。それはHTTPであり、したがって設計によりRESTと互換性があります:)。
より良い解決策:
複数のリクエストを含むワークフローを実行するクライアントについて話す場合、通常はプロトコルについて話します。すべてのプロトコル形式には、Bを実行する前にステップAを実行するなど、潜在的なステップごとに一連の前提条件が付属しています。
これは自然なことですが、クライアントにプロトコルを公開すると、すべてがより複雑になります。それを避けるために、現実の世界で複雑な相互作用やことをしなければならないときに私たちが何をすべきかを考えてください。エージェントを使用します。
エージェントのメタファーを使用すると、必要なすべての手順を実行できるリソースを提供し、実際の割り当て/それが実行されている指示をリストに格納できます(そのため、エージェントまたは「代理店」でPOSTを使用できます)。
複雑な例:
家を買う:
信頼性を証明する必要があります(警察の記録を提供するなど)、財務の詳細を確認する必要があります。弁護士と資金を保管している信頼できるサードパーティを使用して実際の家を購入し、家が自分のものであることを確認する必要があります。税務記録などに購入用のものを追加します(例として、いくつかの手順は間違っているか、または何でもかまいません)。
これらの手順は完了するまでに数日かかる場合があります。並行して実行できる手順もあります。
これを行うには、次のようにエージェントにタスク購入ハウスを与えるだけです。
POST: agency.com/ { task: "buy house", target:"link:toHouse", credibilities:"IamMe"}.
できました。代理店は、このジョブのステータスを確認および追跡するために使用できる参照をあなたに送り返します。残りは代理店のエージェントによって自動的に行われます。
たとえば、バグトラッカーについて考えてみましょう。基本的にはバグを報告し、バグIDを使用して何が起こっているかを確認できます。サービスを使用して、このリソースの変更をリッスンすることもできます。ミッション完了。