Del tema de la revista a la práctica del proyecto
Páginas de servicios y técnicas relacionadas
Muchas empresas se encuentran hoy en una situación similar: una aplicación especializada crecida con el tiempo (a menudo Delphi/VCL) cubre procesos centrales, pero de repente debe atender nuevos canales. Un portal de clientes necesita datos y operaciones, usuarios móviles esperan accesos seguros, sistemas externos (ERP, DMS, CRM, BI) exigen integraciones. En esta situación, una API REST parece el paso lógico. En la práctica, las iniciativas de API rara vez fracasan por HTTP o JSON, sino por una distribución de responsabilidades poco clara entre cliente, servidor y la persistencia de datos.
Una arquitectura de servidor REST sostenible con Delphi no surge colocando «unos pocos endpoints» sobre tablas de base de datos existentes. Surge cuando la empresa considera conjuntamente reglas de negocio, requisitos de seguridad, soberanía de los datos, límites transaccionales y conceptos de operación. El servidor REST se convierte así en la capa contractual estable entre la lógica de negocio y los consumidores: cliente de escritorio, portal, servicios, socios de integración. Es precisamente aquí donde Delphi muestra sus fortalezas: desarrollo rápido, tiempo de ejecución robusto, código nativo de alto rendimiento, buena conectividad con bases de datos (p. ej. mediante sustitución de BDE con acceso nativo) y la posibilidad de encapsular la lógica de negocio de forma controlada en bibliotecas o módulos de servidor.
Este artículo describe cómo planificar servidores REST con Delphi de modo que permanezcan consistentes desde el punto de vista funcional, se integren en paisajes de sistemas existentes y no se conviertan en una fuente de fallos en producción. El foco está en principios arquitectónicos, trampas típicas en proyectos de modernización y en componentes concretos para seguridad, acceso a datos, versionado y observabilidad.
Por qué una API REST es una decisión arquitectónica en la empresa
En un mundo clásico cliente-servidor muchas reglas estaban implícitas en el cliente de escritorio: validaciones, cambios de estado, cálculos, y a veces incluso autorizaciones. Mientras existiera un único cliente eso no era crítico —desde el punto de vista funcional indeseable, pero manejable. En cuanto varios consumidores acceden a los mismos objetos de negocio, el modelo falla:
- Un portal no puede «reutilizar» las validaciones del cliente.
- Las aplicaciones móviles deben ser aptas para funcionamiento offline, pero no pueden duplicar reglas de negocio.
- Las integraciones necesitan contratos versionados y una semántica de errores clara.
- Compliance exige accesos trazables, modelos de roles y capacidad de auditoría.
La API se convierte en el punto donde confluyen lógica de negocio, permisos y acceso a datos. Su arquitectura decide si su sistema será extensible a largo plazo o si solo generará nueva deuda técnica.
Delphi como plataforma para servidores REST: fortalezas y escenarios típicos
Delphi suele asociarse en empresas con aplicaciones de escritorio. Sin embargo, también es muy apto para servidores REST, especialmente cuando se trata de reutilizar lógica existente o de ofrecer servicios de alto rendimiento. Escenarios típicos en entornos B2B:
- Capa API para software heredado: la aplicación de negocio Delphi existente permanece como UI; el servidor REST encapsula accesos a datos y reglas para nuevos consumidores.
- Backend para portal/área de clientes: el portal web consume endpoints REST que usan el mismo núcleo regulatorio que los procesos internos.
- Servidor de integraciones y conectores: conexión a ERP/DMS/CRM, import/export, procesamiento de eventos, jobs programados.
- Linux-Services o Windows Services: procesos de larga duración, workers de colas, scheduler, workflows documentales.
Lo decisivo no es tanto la etiqueta del framework, sino la disciplina en capas, concurrencia, manejo de errores y despliegue. Delphi permite ambas cosas: iteraciones entregables con rapidez y, al mismo tiempo, una arquitectura limpia y modular —si se planifica conscientemente.
Modelo por capas: arquitectura Layer-3 como base para APIs duraderas
Para software empresarial ha demostrado su eficacia un modelo por capas claro y ligero. En el entorno Delphi esto suele describirse como arquitectura Layer-3. Los términos varían, pero la responsabilidad debe ser inequívoca:
1) Capa API/Transporte (HTTP, serialización, enrutamiento)
Esta capa se encarga de HTTP, autenticación a nivel de protocolo, formatos request/response, routing, códigos de estado, Content-Type y compresión. No debe contener reglas de negocio. Objetivo: intercambiabilidad y testabilidad. Si en el futuro amplía la API REST con protocolos complementarios (p. ej. WebSocket, patrones tipo gRPC, Server-Sent Events), el núcleo de negocio debe permanecer estable.
2) Capa Domain/Service (lógica de negocio, casos de uso, permisos, transacciones)
Aquí reside la verdad funcional: máquinas de estado, cálculos, plausibilidades, reglas multi-tenant, comprobaciones de permisos en acciones de negocio. Esta capa debe ser independiente de la UI y, en lo posible, funcionar sin conocimiento de HTTP. Idealmente implemente casos de uso como «liberar pedido», «cerrar ticket», «generar factura» en lugar de exponer solo CRUD sobre tablas.
3) Capa Data-Access (repositorios, SQL, FireDAC, mapeo)
Esta capa encapsula la persistencia: SQL, stored procedures, control transaccional, conceptos de bloqueo, connection-pooling y particularidades específicas de la BD. En Delphi BDE-Ablosung mit nativer Anbindung suele ser la opción pragmática, especialmente en migraciones (sustitución de BDE) y en entornos heterogéneos (SQL Server, PostgreSQL, MariaDB, Firebird). Es importante que Data-Access no conozca HTTP ni tome decisiones de negocio.
Este modelo reduce el acoplamiento: cambios en el modelo de datos no obligan a reescribir la API, y nuevos clientes heredan la misma lógica. Especialmente en la modernización Delphi, esto es la base para desacoplar aplicaciones de escritorio crecidas por fases sin interrumpir la operación.
Diseño de API para software empresarial: no solo CRUD, sino contratos funcionales
Muchas APIs empiezan con endpoints como /customers, /orders, /documents e implementan CRUD. Eso puede bastar para herramientas internas, pero en software empresarial resulta pronto superficial. Los procesos de negocio consisten en cambios de estado, reglas, efectos secundarios y autorizaciones.
Modelar recursos, acciones y estados con claridad
Un patrón más adecuado combina recursos con acciones explícitas, por ejemplo:
- Leer recurso: GET /orders/{id}
- Disparar acción: POST /orders/{id}/release
- Generar documento: POST /orders/{id}/documents/invoice
- Comprobar estado: GET /orders/{id}/status
Así el contrato de la API deja claro que «liberar» no es simplemente actualizar un campo. El servidor puede centralizar validaciones, permisos, transacciones, auditoría y procesos secundarios.
Semántica de errores y validación: que los clientes puedan planificar
Los clientes empresariales deben poder distinguir tipos de errores: errores de validación (400), permiso denegado (403), conflicto por modificación paralela (409), rechazo funcional (a menudo 409 o 422), problemas temporales del backend (503). Es importante una estructura de error consistente, por ejemplo con código de error, mensaje, indicaciones de campo opcionales y una ID de correlación. Así un portal puede mostrar mensajes comprensibles y a la vez soporte y operaciones pueden rastrear eficientemente incidencias.
Seguridad: autenticación no es lo mismo que autorización
En contextos B2B la seguridad raramente falla por cifrado; la falla habitual es no separar identidad, roles y permisos funcionales. Una arquitectura de servidor REST debe distinguir por tanto dos niveles:
Autenticación (¿quién es?)
Los procedimientos habituales son enfoques basados en tokens (p. ej. JWT u opaque tokens), combinados con TLS y una estrategia de sesión clara. Lo decisivo es: duración del token, mecanismo de refresh, bloqueo tras cambios de rol, y la cuestión de si usar distintos Identity Providers para portales e internos. Los servidores Delphi pueden actuar tanto como resource-servers como, según la configuración, emitir tokens. En muchas infraestructuras empresariales la integración con sistemas de identidad existentes (p. ej. AD/LDAP, soluciones SSO) es un punto clave.
Autorización (¿puede hacer esto?)
La autorización pertenece a la capa Domain/Service. Roles y permisos rara vez son puramente técnicos; dependen de tenant, ubicación, unidad organizativa, estado contractual o fase de proceso. Buenas prácticas:
- Modelo de roles (p. ej. Admin, Operador, Auditor) como base
- Políticas funcionales («solo puede generar factura en estado X», «solo puede ver tickets propios»)
- Multi-tenancy como estándar: cada request necesita contexto de tenant
- Auditoría: quién realizó qué acción y cuándo
La API no debe limitarse a devolver «acceso permitido/denegado», sino impedir de forma consistente que mediante trucos con parámetros se puedan ver datos de otros tenants. Esto parece obvio, pero en sistemas heredados es uno de los errores arquitectónicos más comunes cuando se expone «tablas sobre HTTP» demasiado rápido.
Acceso a datos con FireDAC: transacciones, pooling y estrategia de base de datos
En aplicaciones empresariales el acceso a datos es el factor de estabilidad: picos de carga, deadlocks, informes pesados, actualizaciones paralelas, importaciones masivas. FireDAC es en el ecosistema Delphi un componente probado para abordar distintas bases de datos con un acceso unificado. Para una arquitectura de servidor REST son especialmente importantes los siguientes puntos:
Fronteras transaccionales por caso de uso
Una API REST suele ser request-based. Eso encaja bien con «una transacción por caso de uso»: dentro de un request se abre una transacción, se ejecutan operaciones funcionales y luego commit/rollback. Importante: no envolver cada endpoint automáticamente en una transacción, pero ser consistente en las operaciones de escritura. Los endpoints de lectura pueden necesitar también transacciones según el nivel de aislamiento requerido para vistas coherentes.
Estrategia de conexiones y paralelismo
La concurrencia en servidor implica: muchos requests simultáneos, cada uno con acceso a BD. Planifique por tanto:
- pools de tamaño limitado y monitorizados
- timeouts para consultas y conexiones
- reglas claras para operaciones de larga duración (externalizarlas a jobs/workers)
Un error frecuente es ejecutar informes costosos o exportaciones masivas de forma síncrona en la misma instancia API que atiende peticiones interactivas. Es preferible separar: interactivo vs. batch/async.
Modernización de la base de datos como parte de la planificación de la API
Si en el legado aún existen accesos antiguos (p. ej. BDE), la API actúa como catalizador: obliga a definir límites claros de acceso a datos. Una sustitución controlada hacia FireDAC reduce riesgos y aumenta la portabilidad (PostgreSQL, MariaDB, SQL Server). Es importante no planificarlo como un «Big Bang», sino por fases: los nuevos casos de uso del servidor usan ya la nueva capa de acceso a datos mientras que las piezas antiguas migran progresivamente.
Versionado y compatibilidad hacia atrás: los contratos API protegen
Las empresas subestiman a menudo lo costoso que resulta un breaking change. En cuanto un portal de clientes, un sistema de partners o un Windows service depende de su API, no puede «renombrar campos» a la ligera. Por eso una estrategia de versionado limpia es obligatoria.
Reglas pragmáticas para el versionado
- No breaking changes sin versión: no renombrar/retirar campos ni reinterpretar endpoints.
- Extender en lugar de cambiar: añadir campos, marcar los antiguos como deprecated.
- Defaults compatibles: evitar nuevos campos obligatorios o derivarlos en el servidor.
- Versionado explícito: por ejemplo /v1/… o mediante headers; lo importante no es el método sino la consistencia.
Para equipos Delphi esto implica también: mantener estables los DTOs (Data Transfer Objects) y diseñar el mapeo conscientemente en lugar de serializar objetos de dominio 1:1. Al principio exige más trabajo, pero reduce costes de soporte a largo plazo.
Observability: planificar logs, métricas y traces desde el inicio
En operación productiva «a mí me funciona» no sirve si los fallos no son reproducibles. Precisamente los servidores REST que sirven a muchos consumidores necesitan un mínimo de observabilidad:
Logging estructurado con ID de correlación
Cada request debe llevar una ID de correlación (aceptarla si viene o generarla) y aparecer en los logs. Las entradas de log deben ser estructuradas (p. ej. JSON) para poder ingerirse en sistemas centrales. Lo mínimo relevante:
- Método de request, ruta, código de estado, duración
- Contexto usuario/tenant (pseudonimizado/conforme a normativa)
- Duración de BD y clase de error
- ID de correlación para soporte
Métricas para capacidad y tendencias de error
Para escalado y estabilidad necesita métricas: requests por minuto, latencias p95/p99, tasas de error por endpoint, uso del pool de BD, longitudes de colas. No hace falta un «Cloud-Native Overkill», pero sin cifras las discusiones sobre rendimiento son opiniones.
Manejo de errores y excepciones como componente arquitectónico
Excepciones de Delphi no deben filtrarse sin control hacia fuera. Una middleware central de excepciones (o un handler global) debe traducir excepciones a respuestas de error consistentes, incluyendo ID de soporte y códigos HTTP adecuados. Internamente los stacktraces deben ir a logs seguros, no a las respuestas para clientes.
Síncrono vs asíncrono: extraer procesos largos de la respuesta REST
Muchos procesos empresariales no son «request/response en 200 ms»: generación de PDFs, importación de datos, ejecuciones de interfaces, reconciliaciones, cambios masivos, archivado. Estas cargas rara vez pertenecen a un endpoint REST síncrono, porque consumen hilos, provocan timeouts y bloquean al usuario.
Patrón Job
Funciona bien: un endpoint inicia un job y el servidor devuelve inmediatamente una Job-ID. Otro endpoint ofrece estado/resultado. Opcionalmente un callback/webhook puede notificar. En Delphi esto se puede implementar con servicios worker, una tabla de jobs y una máquina de estados clara. La ventaja: estabilidad y escalado predecible.
Colas y servicios
Dependiendo del entorno, una cola de mensajes puede ser conveniente, pero no es obligatoria. Lo importante es el principio: las APIs interactivas permanecen responsivas, los procesos batch se ejecutan de forma controlada, repetible y observable —como Windows Services o Linux-Services según el despliegue.
Despliegue en la empresa: Windows, Linux, contenedores, on‑prem
Una arquitectura de servidor REST solo está «completa» si es operable. Las empresas difieren mucho: servidores clásicos [[NBML_TERM_3_aea23489 ]], hosts virtualizados Linux, plataformas de contenedores, zonas de red estrictas, requisitos de proxy y certificados. Delphi es flexible aquí, siempre que las dependencias se controlen de forma ordenada.
Configuración y secretos
La configuración debe ser dependiente del entorno (Dev/Test/Prod). Credenciales no deben estar en EXE ni en repositorio. Utilice almacenamiento seguro (p. ej. el secrets-management de la plataforma) y separe valores de configuración del ciclo de entrega de código. Planifique además rotaciones (contraseñas de BD, API-Keys) sin tener que recompilar el sistema.
Estrategias de release y rollback
Si varios consumidores dependen de una API, necesita releases controlados: scripts de migración para cambios en BD, feature toggles para activación gradual, rutas de rollback claras. En particular, los cambios en la base de datos deben ser retrocompatibles para permitir un rollback de la versión del servidor si fuera necesario.
Integración con software legado: modernización incremental en lugar de Big Bang
En muchos paisajes Delphi el núcleo funcional es valioso, pero técnicamente está «pegado»: accesos orientados a UI, estados globales, responsabilidades mezcladas. Una API REST puede ser riesgo y oportunidad a la vez. El objetivo debe ser un camino que aporte mejoras medibles con esfuerzo razonable.
Enfoque Strangler para APIs
En lugar de reescribir todo, defina puntos de corte funcionales que aporten valor real: p. ej. «estado de pedidos y documentos para portal de clientes», «lookup de datos maestros para usuarios móviles», «interfaz para asientos contables en ERP». Estos casos de uso se implementan como nuevas funciones de API, incluyendo capa de dominio y Data-Access. El cliente antiguo puede migrar gradualmente a los mismos casos de uso del servidor sin que la UI necesite rediseñarse de inmediato.
Lógica de negocio compartida: útil pero controlada
Delphi permite reutilizar bibliotecas de lógica de negocio tanto en servidor como en aplicaciones existentes. Esto puede servir de puente, pero entraña riesgos: si dependencias de UI se filtran en la lógica compartida se pierde el desacoplamiento. Una regla clara ayuda: solo debe compartirse lógica sin UI, sin estados globales, con interfaces claras y unidades testeables. Todo lo demás permanece separado.
Errores típicos en proyectos de servidor REST — y cómo evitarlos
«Simplemente publicamos tablas»
Si los endpoints reflejan tablas directamente, se obtiene un sistema inestable: cada refactor de la BD es un breaking change de la API, la lógica funcional se duplica en los clientes y las vulnerabilidades por parámetros sin validar aumentan. Mejor: casos de uso de dominio y DTOs que estabilicen el contrato.
Permisos funcionales solo en el cliente
Los clientes son intercambiables y manipulables. La autorización debe residir en el servidor y considerar reglas funcionales, no solo roles técnicos.
Falta de estrategia clara para concurrencia
Las actualizaciones paralelas ocurren: dos operadores, portal y cliente interno, o un job de importación. Sin optimistic locking (p. ej. RowVersion/Timestamp), códigos de conflicto (409) y reglas de merge claras, se producen pérdidas de datos o el clásico «el último que escribe gana».
Procesos largos bloquean endpoints interactivos
La generación síncrona de PDFs o exportaciones provoca timeouts y experiencias de «bloqueo». Mejor el patrón Job con endpoints de estado.
Observability añadida a posteriori
Sin ID de correlación, logs estructurados y métricas, cada incidencia se convierte en una búsqueda. La observabilidad no es un lujo, es requisito operativo.
Lista de comprobación concreta para su arquitectura de servidor REST con Delphi
- Separar capas con claridad: Transporte (HTTP), Dominio (Use Cases), Data Access (FireDAC/SQL).
- Entender la API como contrato: mantener estables los DTOs, planificar versionado, evitar breaking changes.
- Seguridad en dos niveles: autenticación (tokens) más autorización (políticas funcionales, tenant).
- Definir transacciones conscientemente: por caso de uso, timeouts, estrategia de conflictos.
- Extraer procesos largos a asíncrono: jobs/workers, Windows o Linux-Services.
- Incorporar observability: ID de correlación, logs estructurados, métricas, manejo central de errores.
- Planificar despliegue realista: configuración/secrets, rollback, migraciones de BD.
- Modernización iterativa: casos de uso valiosos primero, desacoplar piezas antiguas progresivamente.
Conclusión: los servidores REST despliegan su valor solo como arquitectura operacional y de negocio
Una arquitectura de servidor REST con Delphi es especialmente eficaz para empresas cuando no se interpreta como una «capa técnica» sino como el núcleo que conecta procesos, datos y canales. Lo decisivo son capas limpias (arquitectura Layer-3), endpoints modelados funcionalmente, lógica de seguridad y multi-tenant consistente, así como un modelo operativo con versionado, monitorización y concurrencia controlada. Así la API se convierte en una plataforma estable para portales, integraciones, servicios y la modernización gradual de Delphi —sin poner en riesgo la sustancia funcional de un sistema heredado.
Si desea evaluar cómo implantarse una API REST robusta sobre su paisaje Delphi existente (incluyendo estrategia de base de datos, FireDAC, servicios y operación), puede contactarnos aquí: https://net-base-software-gmbh.de/kontakt/
siguiente paso
Cuando un tema se convierte en un proyecto real, arquitectura, entorno existente y operación deben considerarse conjuntamente desde el inicio.
No solo apoyamos en consultas puntuales, sino también cuando, a partir de fragmentos de código fuente, temas heredados o ideas de portales, debe consolidarse un proyecto empresarial robusto.
- La situación actual, el estado objetivo y los riesgos técnicos se evalúan conjuntamente.
- REST, el acceso a datos, los portales y el despliegue no se relegan a fases posteriores.
- Usted detecta con antelación qué camino es viable, tanto económica como operativamente.