Innanzitutto il trasferimento di denaro non è cosa che non puoi fare in una singola chiamata di risorse. L'azione che vuoi fare è inviare denaro. Quindi aggiungi una risorsa di trasferimento di denaro all'account del mittente.
POST: accounts/alice, new Transfer {target:"BOB", abmount:100, currency:"CHF"}.
Fatto. Non è necessario sapere che si tratta di una transazione che deve essere atomica, ecc. È sufficiente trasferire denaro alias. inviare denaro da A a B.
Ma per i rari casi qui una soluzione generale:
Se vuoi fare qualcosa di molto complesso che coinvolge molte risorse in un contesto definito con molte restrizioni che attraversano effettivamente la barriera what vs. why (conoscenza aziendale vs. implementazione) devi trasferire lo stato. Poiché REST dovrebbe essere apolide, come client è necessario trasferire lo stato in giro.
Se si trasferisce lo stato, è necessario nascondere le informazioni all'interno dal client. Il cliente non dovrebbe conoscere le informazioni interne necessarie solo per l'implementazione, ma non deve contenere informazioni rilevanti in termini di business. Se tali informazioni non hanno valore commerciale, lo stato deve essere crittografato e deve essere utilizzata una metafora come token, pass o altro.
In questo modo si può passare lo stato interno e usare la crittografia e firmare il sistema può essere ancora sicuro e solido. Trovare l'astrazione giusta per il cliente per cui passa informazioni sullo stato è qualcosa che dipende dal design e dall'architettura.
La vera soluzione:
Ricorda che REST sta parlando HTTP e HTTP viene fornito con il concetto di utilizzo dei cookie. Questi cookie vengono spesso dimenticati quando le persone parlano dell'API REST e dei flussi di lavoro e delle interazioni che coprono più risorse o richieste.
Ricorda cosa è scritto in Wikipedia sui cookie HTTP:
I cookie sono stati progettati per essere un meccanismo affidabile per i siti Web per ricordare informazioni statali (come gli articoli in un carrello della spesa) o per registrare l'attività di navigazione dell'utente (inclusi clic su pulsanti particolari, accesso o registrazione delle pagine visitate dall'utente fino a quel momento) come mesi o anni fa).
Quindi, in pratica, se è necessario trasmettere lo stato, utilizzare un cookie. È progettato esattamente per lo stesso motivo, è HTTP e quindi è compatibile con REST di progettazione :).
La soluzione migliore:
Se parli di un client che esegue un flusso di lavoro che coinvolge più richieste, di solito parli di protocollo. Ogni forma di protocollo viene fornita con una serie di precondizioni per ogni potenziale passaggio come eseguire il passaggio A prima di poter eseguire B.
Questo è naturale ma esporre il protocollo ai client rende tutto più complesso. Per evitarlo, pensa solo a ciò che facciamo quando dobbiamo fare interazioni e cose complesse nel mondo reale .... Usiamo un agente.
Usando la metafora dell'Agente puoi fornire una risorsa in grado di eseguire tutti i passaggi necessari per te e archiviare l'assegnazione / le istruzioni effettive su cui sta agendo nel suo elenco (in modo che possiamo usare POST sull'agente o su un'agenzia).
Un esempio complesso:
Comprare una casa:
Devi dimostrare la tua credibilità (come fornire le voci del tuo registro di polizia), devi assicurarti i dettagli finanziari, devi comprare la casa reale usando un avvocato e un terzo fidato che immagazzina i fondi, verificare che la casa ora appartiene a te e aggiungi gli articoli acquistati ai tuoi registri fiscali ecc. (solo come esempio, alcuni passaggi potrebbero essere errati o altro).
Il completamento di questi passaggi potrebbe richiedere alcuni giorni, alcuni in parallelo, ecc.
Per fare questo, devi solo dare all'agente il compito di comprare casa come:
POST: agency.com/ { task: "buy house", target:"link:toHouse", credibilities:"IamMe"}.
Fatto. L'agenzia ti restituisce un riferimento che puoi utilizzare per vedere e tracciare lo stato di questo lavoro e il resto viene fatto automaticamente dagli agenti dell'agenzia.
Pensa ad un bug tracker per esempio. Fondamentalmente si segnala il bug e si può usare l'id del bug per verificare cosa sta succedendo. Puoi persino usare un servizio per ascoltare i cambiamenti di questa risorsa. Missione completata.