Zuallererst ist das Überweisen von Geld nichts, was Sie nicht in einem einzigen Ressourcenaufruf tun können. Die Aktion, die Sie ausführen möchten, ist das Senden von Geld. Sie fügen dem Konto des Absenders eine Geldtransferressource hinzu.
POST: accounts/alice, new Transfer {target:"BOB", abmount:100, currency:"CHF"}.
Getan. Sie müssen nicht wissen, dass dies eine Transaktion ist, die atomar sein muss usw. Sie überweisen einfach Geld aka. Senden Sie Geld von A nach B.
Aber für die seltenen Fälle hier eine allgemeine Lösung:
Wenn Sie etwas sehr Komplexes tun möchten, das viele Ressourcen in einem definierten Kontext mit vielen Einschränkungen umfasst, die tatsächlich die Was-gegen-Warum-Barriere (Geschäfts- oder Implementierungswissen) überschreiten, müssen Sie den Status übertragen. Da REST zustandslos sein sollte, müssen Sie als Client den Status übertragen.
Wenn Sie den Status übertragen, müssen Sie die darin enthaltenen Informationen vor dem Client verbergen. Der Kunde sollte keine internen Informationen kennen, die nur für die Implementierung benötigt werden, aber keine geschäftsrelevanten Informationen enthalten. Wenn diese Informationen keinen geschäftlichen Wert haben, sollte der Status verschlüsselt und eine Metapher wie Token, Pass oder etwas verwendet werden.
Auf diese Weise kann man den internen Status weitergeben und mithilfe von Verschlüsselung und Signatur kann das System immer noch sicher und solide sein. Die richtige Abstraktion für den Kunden zu finden, warum er Statusinformationen weitergibt, hängt vom Design und der Architektur ab.
Die wirkliche Lösung:
Denken Sie daran, dass REST über HTTP spricht und HTTP mit dem Konzept der Verwendung von Cookies geliefert wird. Diese Cookies werden häufig vergessen, wenn über die REST-API sowie über Workflows und Interaktionen gesprochen wird, die sich über mehrere Ressourcen oder Anforderungen erstrecken.
Denken Sie daran, was in der Wikipedia über HTTP-Cookies geschrieben steht:
Cookies wurden als zuverlässiger Mechanismus für Websites entwickelt, um sich an wichtige Informationen (z. B. Artikel in einem Warenkorb) zu erinnern oder die Browsing-Aktivitäten des Benutzers aufzuzeichnen (einschließlich Klicken auf bestimmte Schaltflächen, Anmelden oder Aufzeichnen, welche Seiten der Benutzer bisher besucht hat zurück wie vor Monaten oder Jahren).
Wenn Sie also den Status weitergeben müssen, verwenden Sie ein Cookie. Es wurde aus genau dem gleichen Grund entwickelt, es ist HTTP und daher von Natur aus mit REST kompatibel :).
Die bessere Lösung:
Wenn Sie über einen Client sprechen, der einen Workflow mit mehreren Anforderungen ausführt, sprechen Sie normalerweise über das Protokoll. Jede Form von Protokoll enthält eine Reihe von Voraussetzungen für jeden möglichen Schritt, z. B. Schritt A ausführen, bevor Sie B ausführen können.
Dies ist natürlich, aber das Aussetzen des Protokolls für Clients macht alles komplexer. Um dies zu vermeiden, denken Sie einfach darüber nach, was wir tun, wenn wir komplexe Interaktionen und Dinge in der realen Welt ausführen müssen. Wir benutzen einen Agenten.
Mithilfe der Agentenmetapher können Sie eine Ressource bereitstellen, die alle erforderlichen Schritte für Sie ausführen und die tatsächliche Zuweisung / Anweisung, auf die sie reagiert, in ihrer Liste speichern kann (sodass wir POST für den Agenten oder eine 'Agentur' verwenden können).
Ein komplexes Beispiel:
Ein Haus kaufen:
Sie müssen Ihre Glaubwürdigkeit nachweisen (z. B. die Bereitstellung Ihrer Polizeiaufzeichnungen), Sie müssen finanzielle Details sicherstellen, Sie müssen das eigentliche Haus mit einem Anwalt und einem vertrauenswürdigen Dritten kaufen, der die Gelder aufbewahrt, überprüfen, ob das Haus Ihnen gehört und Fügen Sie das Kaufmaterial Ihren Steuerunterlagen usw. hinzu (nur als Beispiel können einige Schritte falsch sein oder was auch immer).
Diese Schritte können mehrere Tage dauern, einige können parallel ausgeführt werden usw.
Um dies zu tun, geben Sie dem Agenten einfach die Aufgabe Haus kaufen wie folgt:
POST: agency.com/ { task: "buy house", target:"link:toHouse", credibilities:"IamMe"}.
Getan. Die Agentur sendet Ihnen eine Referenz zurück, mit der Sie den Status dieses Auftrags anzeigen und verfolgen können. Der Rest wird automatisch von den Agenten der Agentur erledigt.
Denken Sie zum Beispiel an einen Bug-Tracker. Grundsätzlich melden Sie den Fehler und können anhand der Fehler-ID überprüfen, was los ist. Sie können sogar einen Dienst verwenden, um Änderungen dieser Ressource abzuhören. Mission erledigt.