Tout d'abord, transférer de l'argent n'est rien que vous ne pouvez pas faire en un seul appel de ressource. L'action que vous voulez faire est d'envoyer de l'argent. Vous ajoutez donc une ressource de transfert d'argent au compte de l'expéditeur.
POST: accounts/alice, new Transfer {target:"BOB", abmount:100, currency:"CHF"}.
Terminé. Vous n'avez pas besoin de savoir que c'est une transaction qui doit être atomique, etc. Vous transférez simplement de l'argent aka. envoyer de l'argent de A à B.
Mais pour les rares cas, voici une solution générale:
Si vous voulez faire quelque chose de très complexe impliquant de nombreuses ressources dans un contexte défini avec de nombreuses restrictions qui franchissent en fait la barrière du quoi par rapport au pourquoi (connaissances métier ou implémentation), vous devez transférer l'état. Étant donné que REST doit être sans état, vous, en tant que client, devez transférer l'état.
Si vous transférez l'état, vous devez masquer les informations à l'intérieur du client. Le client ne doit pas connaître les informations internes uniquement nécessaires à la mise en œuvre mais ne porte pas d'informations pertinentes en termes d'affaires. Si ces informations n'ont aucune valeur commerciale, l'état doit être chiffré et une métaphore comme un jeton, un laissez-passer ou quelque chose doit être utilisée.
De cette façon, on peut transmettre l'état interne et en utilisant le cryptage et la signature, le système peut toujours être sécurisé et sain. Trouver la bonne abstraction pour le client pourquoi il transmet des informations d'état est quelque chose qui dépend de la conception et de l'architecture.
La vraie solution:
N'oubliez pas que REST parle de HTTP et HTTP est livré avec le concept d'utilisation de cookies. Ces cookies sont souvent oubliés lorsque les gens parlent de l'API REST et des flux de travail et interactions couvrant plusieurs ressources ou demandes.
Rappelez-vous ce qui est écrit sur Wikipédia à propos des cookies HTTP:
Les cookies ont été conçus pour être un mécanisme fiable permettant aux sites Web de mémoriser des informations avec état (tels que des éléments dans un panier) ou d'enregistrer l'activité de navigation de l'utilisateur (y compris en cliquant sur des boutons particuliers, en se connectant ou en enregistrant les pages visitées par l'utilisateur jusqu'à présent. il y a des mois ou des années).
Donc, fondamentalement, si vous avez besoin de transmettre un état, utilisez un cookie. Il est conçu exactement pour la même raison, c'est HTTP et donc il est compatible avec REST de par sa conception :).
La meilleure solution:
Si vous parlez d'un client exécutant un workflow impliquant plusieurs requêtes, vous parlez généralement de protocole. Chaque forme de protocole est livrée avec un ensemble de conditions préalables pour chaque étape potentielle, comme effectuer l'étape A avant de pouvoir faire B.
C'est naturel, mais exposer le protocole aux clients rend tout plus complexe. Pour éviter cela, pensez simplement à ce que nous faisons lorsque nous devons faire des interactions complexes et des choses dans le monde réel .... Nous utilisons un agent.
En utilisant la métaphore de l'agent, vous pouvez fournir une ressource qui peut effectuer toutes les étapes nécessaires pour vous et stocker la mission / les instructions réelles sur lesquelles elle agit dans sa liste (afin que nous puissions utiliser POST sur l'agent ou une «agence»).
Un exemple complexe:
Acheter une maison:
Vous devez prouver votre crédibilité (comme fournir les entrées de votre casier judiciaire), vous devez vous assurer des détails financiers, vous devez acheter la maison réelle en utilisant un avocat et un tiers de confiance qui stocke les fonds, vérifier que la maison vous appartient maintenant et ajoutez les articles d'achat à vos dossiers fiscaux, etc. (à titre d'exemple, certaines étapes peuvent être erronées ou autre).
Ces étapes peuvent prendre plusieurs jours, certaines peuvent être effectuées en parallèle, etc.
Pour ce faire, vous donnez simplement à l'agent la tâche d'acheter une maison comme:
POST: agency.com/ { task: "buy house", target:"link:toHouse", credibilities:"IamMe"}.
Terminé. L'agence vous renvoie une référence que vous pouvez utiliser pour voir et suivre l'état de ce travail et le reste est fait automatiquement par les agents de l'agence.
Pensez à un bug tracker par exemple. En gros, vous signalez le bogue et pouvez utiliser l'identifiant du bogue pour vérifier ce qui se passe. Vous pouvez même utiliser un service pour écouter les modifications de cette ressource. Mission terminée.