En primer lugar, la transferencia de dinero no es algo que no se pueda hacer en una llamada a un solo recurso. La acción que desea hacer es enviar dinero. Entonces agrega un recurso de transferencia de dinero a la cuenta del remitente.
POST: accounts/alice, new Transfer {target:"BOB", abmount:100, currency:"CHF"}.
Hecho. No necesita saber que esta es una transacción que debe ser atómica, etc. Simplemente transfiere dinero alias. enviar dinero de A a B.
Sin embargo, para los casos raros aquí una solución general:
Si usted quiere hacer algo muy complejo que involucra muchos recursos en un contexto definido con una gran cantidad de restricciones que en realidad cruce la barrera de qué frente a por qué (conocimiento de negocio frente a implementación) que necesita para transferir el estado. Como REST debe ser sin estado, usted como cliente necesita transferir el estado.
Si transfiere el estado, necesita ocultar la información del cliente. El cliente no debe conocer la información interna que solo necesita la implementación, pero no contiene información relevante en términos de negocios. Si esa información no tiene valor comercial, el estado debe estar encriptado y se debe usar una metáfora como token, pase o algo así.
De esta forma se puede pasar el estado interno y utilizar el cifrado y la firma del sistema puede seguir siendo segura y sólida. Encontrar la abstracción correcta para el cliente por qué él pasa información de estado es algo que depende del diseño y la arquitectura.
La verdadera solución:
Recuerde RESTO está hablando HTTP y HTTP viene con el concepto de la utilización de cookies. Esas cookies a menudo se olvidan cuando las personas hablan sobre API REST y flujos de trabajo e interacciones que abarcan múltiples recursos o solicitudes.
Recuerda lo que está escrito en la Wikipedia acerca de las cookies HTTP:
cookies fueron diseñadas para ser un mecanismo confiable para sitios web para recordar la información de estado (por ejemplo, artículos en un carro de compras) o para registrar la navegación del usuario actividad (incluyendo hacer clic en botones particulares, iniciar sesión o registrar qué páginas visitó el usuario hace unos meses o años).
Así que, básicamente, si necesita pasar el estado, utilice una cookie. Está diseñado exactamente por la misma razón, es HTTP y, por lo tanto, es compatible con REST por diseño :).
La mejor solución:
Si se habla de un cliente realiza un flujo de trabajo que involucra múltiples peticiones que suelo hablar de protocolo. Cada forma de protocolo viene con un conjunto de condiciones previas para cada paso potencial, como realizar el paso A antes de poder hacer B.
Esto es natural, pero exponer el protocolo a los clientes hace que todo sea más complejo. Para evitarlo, solo piense en lo que hacemos cuando tenemos que hacer interacciones complejas y cosas en el mundo real ... Usamos un agente.
Usando la metáfora del agente, puede proporcionar un recurso que puede realizar todos los pasos necesarios y almacenar la asignación/instrucciones reales sobre las que actúa en su lista (para que podamos usar POST en el agente o una 'agencia') .
Un ejemplo complejo:
La compra de una casa:
Usted necesita demostrar su credibilidad (como el abastecimiento de sus ingresos en el expediente de la policía), es necesario asegurarse de detalles financieros, lo que necesita para comprar la casa real utilizando un abogado y un tercero de confianza que almacena los fondos, verifica que la casa ahora te pertenece y agrega los elementos de compra a tus registros de impuestos, etc. (solo como un ejemplo, algunos pasos pueden estar equivocados o lo que sea).
Estos pasos pueden tardar varios días en completarse, algunos se puede hacer en paralelo, etc.
Con el fin de hacer esto, que acaba de dar el agente de compra de la casa como tarea:
POST: agency.com/ { task: "buy house", target:"link:toHouse", credibilities:"IamMe"}.
Hecho. La agencia le devuelve una referencia que puede usar para ver y rastrear el estado de este trabajo y el resto lo hacen automáticamente los agentes de la agencia.
Piensa en un rastreador de errores, por ejemplo. Básicamente informa el error y puede usar el id del error para verificar qué está pasando. Incluso puede usar un servicio para escuchar los cambios de este recurso. Misión cumplida.
Obtengo el ejemplo de la cesta de la compra , pero cómo cuando generalizas esto no suena RESTful en absoluto (no estás operando con recursos). No hay un recurso realista relacionado con el banco para envolver a John y Bob. ¡Buena respuesta! Siento que definitivamente te estás moviendo en la dirección correcta. – Gili
¿Por qué TransferMoneyTransaction no sería un recurso bancario viable? –
Pensé que se suponía que un recurso era un objeto de la vida real, no un servicio (es decir, una invocación al método). Si puede inventar recursos que imitan a los servicios, ¿cómo es REST diferente de RPC? – Gili