Antes de mais nada, transferir dinheiro não é algo que você não pode fazer em uma única chamada de recurso. A ação que você deseja fazer é enviar dinheiro. Então você adiciona um recurso de transferência de dinheiro à conta do remetente.
POST: accounts/alice, new Transfer {target:"BOB", abmount:100, currency:"CHF"}.
Feito. Você não precisa saber que esta é uma transação que deve ser atômica etc. Você apenas transfere dinheiro, também conhecido como. envie dinheiro de A para B.
Mas para os casos raros aqui uma solução geral:
Se você deseja fazer algo muito complexo envolvendo muitos recursos em um contexto definido, com muitas restrições que realmente atravessam a barreira o quê versus por que (negócios versus conhecimento de implementação), é necessário transferir o estado. Como o REST deve ser sem estado, você como cliente precisa transferir o estado.
Se você transferir o estado, precisará ocultar as informações internas do cliente. O cliente não deve conhecer informações internas necessárias apenas pela implementação, mas não carrega informações relevantes em termos de negócios. Se essas informações não tiverem valor comercial, o estado deve ser criptografado e uma metáfora como token, passe ou algo precisa ser usado.
Dessa maneira, pode-se passar o estado interno e, usando a criptografia e a assinatura do sistema, ainda pode estar seguro e seguro. Encontrar a abstração certa para o cliente por que ele repassa informações de estado é algo que depende do design e da arquitetura.
A solução real:
Lembre-se de que o REST está falando HTTP e HTTP vem com o conceito de uso de cookies. Esses cookies geralmente são esquecidos quando as pessoas falam sobre a API REST, fluxos de trabalho e interações que abrangem vários recursos ou solicitações.
Lembre-se do que está escrito na Wikipedia sobre cookies HTTP:
Os cookies foram projetados para ser um mecanismo confiável para os sites lembrarem informações de estado (como itens em um carrinho de compras) ou para registrar a atividade de navegação do usuário (incluindo clicar em determinados botões, fazer login ou registrar quais páginas foram visitadas pelo usuário até o momento). há meses ou anos atrás).
Então, basicamente, se você precisar passar o estado, use um cookie. Ele foi projetado exatamente pela mesma razão, é HTTP e, portanto, é compatível com o REST por design :).
A melhor solução:
Se você fala sobre um cliente executando um fluxo de trabalho envolvendo várias solicitações, geralmente fala sobre protocolo. Toda forma de protocolo vem com um conjunto de condições prévias para cada etapa potencial, como a etapa A antes de você executar a B.
Isso é natural, mas expor o protocolo aos clientes torna tudo mais complexo. Para evitá-lo, pense no que fazemos quando precisamos fazer interações e coisas complexas no mundo real. Nós usamos um agente.
Usando a metáfora do agente, você pode fornecer um recurso que pode executar todas as etapas necessárias para você e armazenar as atribuições / instruções reais em que está atuando em sua lista (para que possamos usar o POST no agente ou em uma 'agência').
Um exemplo complexo:
Comprando uma casa:
Você precisa provar sua credibilidade (como fornecer suas anotações policiais), garantir detalhes financeiros, comprar a casa real usando um advogado e um terceiro confiável armazenando os fundos, verificar se a casa agora pertence a você e adicione os itens de compra aos seus registros fiscais etc. (apenas como exemplo, algumas etapas podem estar erradas ou o que for).
Essas etapas podem levar vários dias para serem concluídas, algumas podem ser realizadas em paralelo etc.
Para fazer isso, basta atribuir ao agente a tarefa de comprar uma casa como:
POST: agency.com/ { task: "buy house", target:"link:toHouse", credibilities:"IamMe"}.
Feito. A agência envia de volta uma referência para você que você pode usar para ver e rastrear o status desse trabalho, e o restante é feito automaticamente pelos agentes da agência.
Pense em um rastreador de erros, por exemplo. Basicamente, você relata o bug e pode usar o ID do bug para verificar o que está acontecendo. Você pode até usar um serviço para ouvir as alterações desse recurso. Missão Concluída.