まず第一に、送金は 1 回のリソース呼び出しではできないことではありません。あなたがしたい行動は送金です。したがって、送金リソースを送信者のアカウントに追加します。
POST: accounts/alice, new Transfer {target:"BOB", abmount:100, currency:"CHF"}.
終わり。これがアトミックでなければならないトランザクションであることなどを知る必要はありません。単に送金するだけです。AからBにお金を送る.
ただし、ここでのまれなケースの一般的な解決策は次のとおりです。
定義されたコンテキストで多くのリソースを含む非常に複雑なことを行いたい場合は、実際に何となぜの障壁 (ビジネスと実装の知識) を越える多くの制限がある場合は、状態を転送する必要があります。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 を使用して何が起こっているかを確認できます。サービスを使用して、このリソースの変更をリッスンすることもできます。ミッション完了。