Aquí hay algunas buenas respuestas, pero no estoy seguro de que te ayuden a convencer a tus compañeros de trabajo. Como muchos han señalado, lo que está sugiriendo no es alejarse del diseño RESTful, y creo que es clave para lograr que su propuesta se incorpore.
REST no se trata de asegurarse de que su API solo permita almacenar y recuperar datos. Más bien, se trata de modelar acciones como recursos. Su API debe permitir que se tomen acciones ( después de todo, es una interfaz de programación de aplicaciones). La pregunta es cómo modelar esas acciones.
En lugar de encontrar un término, los ejemplos son probablemente la mejor manera de explicar esto a sus compañeros de trabajo. . De esta manera, puede mostrar cómo lo están haciendo ahora, qué problemas esto causa, una solución que resuelve el problema y cómo sigue siendo RESTful.
Echemos un vistazo a su objeto de cliente.
Problema:
La interfaz de usuario envía a un cliente, pero las tablas posteriores aún no se han actualizado. ¿Qué sucede si una de las llamadas subsiguientes falla debido a un error en su código de UI (o mal funcionamiento del complemento del navegador, etc.)? Ahora sus datos están en un estado inconsistente. Incluso podría ser un estado que rompa otras partes de su API o interfaz de usuario, sin mencionar que simplemente no es válido. ¿Cómo te recuperas? Tendría que probar cada estado posible para asegurarse de que esto no rompería algo, pero sería difícil saber qué es posible.
Solución:
Crea un punto final API para crear clientes. Sabes que no quieres tener un punto final "/ customer / create" o incluso "/ create-customer", porque create es un verbo y violaría REST. Así que dígalo. "/ customer-creation" podría funcionar. Ahora, cuando PUBLICA su objeto CustomerCreation, enviará todos los campos necesarios para que un cliente se cree completamente. El punto final se asegurará de que los datos estén completos y sean válidos (devolviendo un valor 400 o algo así si falla la validación), y puede persistir todo en una sola transacción de base de datos, por ejemplo.
Si también necesita un punto final para OBTENER / objetos de cliente, está bien. Puedes tener ambos. El truco es crear puntos finales que satisfagan las necesidades de los consumidores.
Ventajas:
- Usted garantiza que no terminará con un mal estado
- En realidad, es más fácil para los desarrolladores de UI si no tienen que "saber" el pedido de solicitudes, preocupaciones de validación, etc.
- No es tan hablador de una API, lo que reduce la latencia de las solicitudes de red
- Es más fácil probar y conceptualizar escenarios (los datos faltantes / malformados de la interfaz de usuario no se distribuyen entre las solicitudes, algunas de las cuales pueden fallar)
- Permite una mejor encapsulación de la lógica empresarial.
- En general, facilita la seguridad (porque los usuarios pueden modificar la lógica empresarial y de orquestación en la interfaz de usuario)
- Es probable que reduzca la duplicación lógica (es más probable que tenga 2+ consumidores de una API que 2+ API que dan acceso a los mismos datos)
- Aún 100% RESTANTE
Desventajas
- Es potencialmente más trabajo para el desarrollador de back-end (pero puede no ser a largo plazo)
Puede ser difícil para las personas comprender este paradigma y qué tiene de bueno si no lo han probado. Esperemos que pueda ayudarlos a ver usando un ejemplo de su propio código.
Mi propia experiencia es que una vez que los desarrolladores de mi equipo comenzaron a implementar esta estrategia, casi de inmediato vieron los beneficios.
Estudio adicional:
Este artículo de Thoughtworks realmente me ayudó a tener la idea de modelar acciones como objetos usando ejemplos prácticos: https://www.thoughtworks.com/insights/blog/rest-api-design-resource-modeling
También sugeriría leer sobre CQRS y Event Sourcing ya que están preocupados precisamente por este tipo de cosas (es decir, divorciar su API de la lógica de persistencia real). No sé qué tan dispuestos estarían tus compañeros de trabajo a leer este tipo de cosas, pero puede darte más claridad y ayudarte a explicárselos.