Del tema de la revista a la práctica del proyecto
Páginas de servicios y técnicas relacionadas
Video-Botschaft
Desarrollar servidores REST con Delphi: arquitectura, seguridad y operación en la práctica
Kurz erklärt, warum bei Delphi-REST-Servern nicht der erste funktionierende Endpunkt zählt, sondern Architektur, Security und Betrieb: konsistente Fehler, Authentifizierung, Logging/Monitoring und sauberes Deployment für Windows und Linux.
Video mit KI erstellt
Transkript anzeigen
Hallo, ich bin Mark. Der erste funktionierende REST-Endpunkt ist oft der Anfang der Probleme, nicht das Ende.
Im Beitrag „REST-Server mit Delphi entwickeln: Architektur, Sicherheit und Betrieb in der Praxis“ geht es genau darum. In Unternehmen scheitern APIs selten an Delphi oder am Framework.
Sie scheitern an Betrieb: uneinheitliche Fehler, fehlende Zeitlimits, unklare Zuständigkeiten. Und an Sicherheit: Authentifizierung, also wer sich ausweist, und Autorisierung, also was jemand darf.
Wichtig ist eine klare Trennung: vorne HTTP und Validierung, in der Mitte die Fachlogik, hinten Datenzugriff. Dazu gehören Logging und Monitoring, damit Sie Störungen nachvollziehen, bevor Nutzer Tickets schreiben.
Wenn Sie dazu Fragen haben, klären wir gern die typischen Stolperstellen aus der Praxis.
Quien quiera desarrollar un servidor REST con Delphi rara vez persigue un objetivo por sí mismo en entornos empresariales. Normalmente se trata de interfaces fiables entre sistemas heredados, portales, servicios y bases de datos, con requisitos claros sobre operación, seguridad y mantenibilidad. Lo decisivo no es tanto la rapidez de la primera respuesta de un endpoint, sino si el servicio se mantiene estable en el día a día: patrones de error comprensibles, accesos a datos controlados, autenticación limpia, responsabilidades claras en la arquitectura y un despliegue que encaje en entornos Windows y Linux.
Delphi es, en muchas organizaciones, un enfoque pragmático: la lógica de negocio existente puede seguir utilizándose, el rendimiento suele ser suficiente y existen varias vías para implementar APIs basadas en HTTP. En la práctica las opciones difieren menos en «si puede REST» y más en transparencia y operación: ¿con qué consistencia se pueden implementar logging, timeouts, reglas de proxy inverso, versionado, documentación OpenAPI y mecanismos de seguridad?
Este artículo clasifica los enfoques más importantes con Delphi y muestra qué deben vigilar la dirección IT, los administradores y los responsables técnicos de proyecto: desde el diseño de la API, la seguridad y el reemplazo de BDE con acceso nativo a datos, hasta la observabilidad (logs, métricas, tracing) y el despliegue como Windows o servicio Windows y Linux. El objetivo es una base robusta para integraciones con ERP, DMS, CRM o portales de clientes, sin poner el foco en las entrañas de frameworks.
Cuándo merece especialmente la pena un servidor REST en Delphi
Un backend Delphi-REST suele ser apropiado cuando Delphi ya está arraigado en la empresa o cuando se desea reutilizar la lógica de negocio y los accesos a datos de aplicaciones existentes. Situaciones B2B típicas:
- Habilitar API en software legado: a una aplicación VCL o a un núcleo cliente-servidor se le añade una capa REST para que portales, sistemas externos o servicios internos puedan acceder de forma estandarizada.
- Integración y desacoplamiento: varios consumidores (escritorio, portal web, batch, partner) deben utilizar los mismos procesos de negocio sin accesos directos a la base de datos ni interfaces de archivo.
- Modernización por fases: primero introducir una API estable, luego modernizar la UI, módulos o la base de datos de forma incremental. La API actúa como frontera controlada y reduce efectos colaterales.
- Operación y seguridad: las APIs HTTP se pueden operar bien detrás de proxies inversos, autenticar de forma centralizada e integrar en stacks de monitorización.
Importa la expectativa: REST es una superficie de integración, no un sustituto de la coherencia funcional. Quien comienza sin un modelo de dominio claro, sin límites transaccionales definidos o sin una responsabilidad de datos explícita, crea rápido una API accesible pero costosa de mantener y soportar a largo plazo.
Servidores REST con Delphi: opciones en resumen
Delphi ofrece varias vías para un servicio REST. Para los responsables la cuestión no es tanto «qué es moderno», sino: ¿cómo encaja con la estructura del equipo, el modelo operativo, la vida útil y los requisitos de cumplimiento?
Delphi WebBroker: ligero, transparente y bien controlable
WebBroker es un framework establecido de Delphi para aplicaciones HTTP. Está próximo al protocolo (request/response), por lo que es fácil de seguir y atractivo en muchos escenarios B2B donde importan el tratamiento controlado de errores, el manejo correcto de headers y una pila manejable. WebBroker suele operar bien detrás de un proxy inverso que termine TLS (cifrado de transporte) y aplique reglas de seguridad centralizadas.
Consecuencia práctica: muchas funciones de conveniencia (convenciones de routing, cadenas de middleware, mantenimiento de OpenAPI) deben añadirse de forma estructurada. Esto no es un inconveniente si los estándares de arquitectura ya son prioritarios.
Delphi Horse: routing y middleware para estándares de API claros
Delphi Horse es ligero y apuesta por un enrutamiento comprensible junto con el principio de middleware. Middleware aquí significa: pasos de procesamiento reutilizables „alrededor“ del endpoint, por ejemplo autenticación, logging, límites de tasa o validación de requests. Para muchos equipos es un enfoque productivo porque permite imponer estándares de forma centralizada.
Importante para la operación: defina pronto un formato de error uniforme, timeouts, tamaños máximos de request y un estándar de logging. Sin estas reglas el sistema puede funcionar, pero el soporte y las ampliaciones serán innecesariamente costosos.
RAD Server: enfoque de plataforma con componentes integrados
RAD Server (antes EMS) sigue más bien un enfoque de plataforma con funciones integradas como gestión de usuarios y otros componentes. Puede encajar donde varios clientes necesitan un backend común y se aprovechan las características de la plataforma. Para APIs de integración puras no es automáticamente la mejor opción; en esos casos suelen primar la transparencia, las dependencias reducidas y un modelo operativo esbelto.
DataSnap: valorar realísticamente instalaciones existentes
DataSnap está presente históricamente en muchas paisajes Delphi y puede ofrecer endpoints tipo HTTP/REST. Para iniciativas nuevas conviene revisar si encaja con el estilo de API previsto, con autenticación (p. ej. JWT), con OpenAPI/Swagger y con los requisitos operativos modernos. Con frecuencia la vía pragmática es: seguir usando la lógica existente, pero exponerla mediante una capa REST bien definida que imponga estándares para seguridad, logging y versionado.
Arquitectura que soporta operación y mantenimiento
Un error habitual en proyectos REST es el „handler lo hace todo“: se leen parámetros HTTP, se construye SQL directamente, se implementan reglas de negocio y además se añade logging. Al principio parece rápido, pero conduce a código difícil de probar y a cambios inestables.
En entornos empresariales funciona una estratificación clara. Una estructura pragmática y común es la arquitectura Layer-3 (tres capas), que separa responsabilidades:
Capa de transporte: HTTP, Auth, validación, formato de respuesta
Aquí se recibe el request, se realiza la validación básica y se genera un formato de respuesta consistente. En esta capa también van la autenticación y autorización (quién puede qué) así como reglas técnicas como límites de request, CORS o la asignación de Correlation-IDs (IDs únicas por petición para trazabilidad).
Capa de dominio: casos de uso de negocio en lugar de lógica de endpoint
El dominio encapsula flujos funcionales como „crear pedido“, „cambiar estado“ o „vincular documento“. Lo decisivo: esta lógica debe ser lo más independiente posible del framework HTTP. Así la misma capa de dominio puede reutilizarse desde un servicio Windows y Linux, un daemon Linux o un proceso batch sin duplicar lógica.
Persistencia e integración: FireDAC, base de datos, ERP/DMS/SMTP
Esta capa agrupa el acceso a bases de datos y sistemas externos. Para Delphi el stack habitual de acceso a datos es BDE-Ablosung mit nativer Anbindung para conectar limpiamente PostgreSQL, SQL Server, MariaDB/MySQL o Firebird. Lo importante no es solo „usar FireDAC“, sino reglas vinculantes: manejo de conexiones, límites transaccionales, timeouts, enlace de parámetros, traducción de errores técnicos en códigos de error de API y estrategias de reintento uniformes donde tengan sentido desde el punto de vista del negocio.
Diseño de API: estable durante años, no solo hasta el Go-live
En entornos B2B una API es una interfaz mantenida a largo plazo. El término clave es compatibilidad: los consumidores confían en campos, códigos de estado y semántica. Cuanto más claras sean esas reglas, menos esfuerzo requerirán las integraciones, el soporte y las versiones.
Recursos y rutas: consistencia antes que creatividad
Las APIs estables suelen ser orientadas a recursos: „/customers“, „/orders/123“, „/orders/123/items“. Las acciones de proceso se pueden representar como subrecursos o como endpoints de acción justificables, por ejemplo „/orders/123/cancel“ cuando un modelo CRUD puro no encaja con el dominio. Lo decisivo es una convención uniforme, documentada y usada por todo el equipo.
Métodos HTTP y códigos de estado: señales claras para los consumidores
Una API fácil de integrar usa la semántica HTTP esperada: GET para lecturas, POST para creación, PUT/PATCH para modificaciones, DELETE para borrados. Igualmente importante es un comportamiento de errores consistente. Para operación es útil un objeto de error estandarizado con:
- Estado HTTP (p. ej. 400, 401, 403, 404, 409, 422, 500)
- código de error estable (legible por máquina, documentado)
- Correlation-ID (para una rápida correlación en logs)
- detalles opcionales (p. ej. errores por campo en validación)
Un tropiezo frecuente son las respuestas „200 OK“ con un texto de error en el body. Eso complica las integraciones y conduce a lógica cliente propensa a errores.
Versionado y expansión compatible
El versionado es un problema de proceso y comunicación, no solo técnico. Enfoques comunes son versionado por URL (p. ej. „/api/v1“) o por cabeceras. En muchas empresas la regla principal es: extender de forma compatible. Añadir campos nuevos suele ser inocuo. Eliminar o reinterpretar campos requiere una nueva versión y un periodo de migración comunicado claramente. Esto reduce interrupciones en integraciones y hace los lanzamientos previsibles.
Seguridad: autenticación, autorización, superficies de ataque
Un servicio REST es una posible puerta de entrada. Muchos problemas de seguridad no aparecen por falta de cifrado, sino por errores de detalle: permisos demasiado amplios, lifetime de tokens demasiado largos, endpoints administrativos sin protección, reglas CORS descontroladas o logs con datos sensibles.
TLS y proxy inverso: responsabilidades claras en la red
En entornos típicos TLS termina en el proxy inverso (p. ej. Nginx, Apache o Microsoft IIS como proxy inverso). El servicio Delphi funciona internamente sobre HTTP y solo es accesible desde la red interna. Son importantes reglas claras para „X-Forwarded-For“ y „X-Forwarded-Proto“ para que la IP del cliente y el protocolo se interpreten correctamente. Esa información es relevante para auditoría, limitación de tasa y resolución de errores.
JWT, API-Keys y SSO: lo que encaja en la práctica
Para integraciones sistema a sistema son comunes las API-Keys o los mecanismos de Client Credentials. Para accesos de usuarios en contextos empresariales suelen ser prácticos los JWT (JSON Web Token) en combinación con un proveedor de identidad central (p. ej. OIDC). En paisajes SSO también puede ser relevante SAML 2.0 (un estándar para Single Sign-on, normalmente entre portal/gateway y proveedor de identidad).
Independientemente del mecanismo, debe definirse:
- Rotación de claves y certificados (¿cómo se renuevan las firmas?)
- Roles/Scopes (¿qué permisos aplican a qué endpoints?)
- Multitenancy (¿cómo se fuerza de forma limpia la asignación de tenant?)
- Audit-Logging (¿quién realizó qué acción funcional y cuándo?)
Validación de entrada, CORS y rate limiting
La validación de entrada debe ser multinivel: sintáctica (tipos de datos, estructura JSON), de negocio (rangos de valores, transiciones de estado) y relevante para seguridad (nombres de archivos, rutas, headers). Para clientes en navegador es importante CORS (qué origins y headers están permitidos). CORS debe configurarse de forma restrictiva. El rate limiting protege contra abuso y picos de carga; con frecuencia se implementa en el proxy inverso y se complementa con límites en el servidor (tamaño máximo del body, timeouts, concurrencia limitada).
FireDAC y acceso a la base de datos: la estabilidad nace de las reglas
En backends REST el acceso a la base de datos suele ser el factor dominante en latencia y estabilidad. FireDAC proporciona las capacidades técnicas, pero la seguridad operativa surge de normas de trabajo.
Manejo de conexiones y concurrencia
Un error clásico es una conexión a la base de datos compartida globalmente y utilizada en paralelo por varias requests. En un servidor REST con procesamiento concurrente (hilos/workers) debe quedar claro qué objetos son thread-safe y cuáles no. En la práctica esto significa: gestionar conexiones y objetos de query por request o por unidad de trabajo, o usar pooling controlado según el modelo de servidor. Eso reduce deadlocks, errores esporádicos y problemas difíciles de reproducir.
Transacciones a lo largo de casos de uso
Las transacciones pertenecen al dominio: un caso de uso decide qué es atómico. A menudo „una request = una transacción“ tiene sentido, pero no siempre. Los endpoints solo de lectura a menudo no necesitan una transacción explícita, mientras que flujos de escritura que afectan varias tablas deben hacerlo de forma consistente. En integraciones externas (ERP, DMS, webhooks) las transacciones distribuidas suelen ser poco realistas; aquí ayudan órdenes claras y lógica de compensación (¿cómo se revierte un éxito parcial?).
Timeouts, backpressure y fallos controlados
Sin timeouts las peticiones, hilos y conexiones a BD se acumulan. Por tanto, configure timeouts tanto a nivel HTTP como DB. Además, el backpressure es importante: limite la concurrencia y las longitudes de cola para que el sistema pueda responder bajo carga con 503 (Service Unavailable) de forma controlada en lugar de colapsar por agotamiento de recursos. Para la operación es preferible una imagen de error rápida y clara a esperas de minutos.
Payloads, DTOs y compatibilidad a largo plazo
JSON es el estándar, pero la interoperabilidad viene dada por los detalles: formato de fecha/hora, zonas horarias, valores nulos, representación decimal, nombres de campos y encoding. Defina un estándar (p. ej. ISO-8601 en UTC) y aplíquelo de manera consistente.
DTOs en lugar de publicar estructuras de base de datos
Los DTOs (Data Transfer Objects) son modelos de datos de API optimizados para el intercambio. No deberían reflejar directamente las tablas de la base de datos. Así se evita que cambios internos del esquema provoquen rupturas inmediatas en la API. Además, permite controlar qué campos internos no se exponen (p. ej. flags, columnas de auditoría) y cómo refactorizar internamente sin poner en riesgo las integraciones.
Considerar idempotencia y reintentos
En redes empresariales son habituales timeouts y reintentos. Defina qué operaciones son idempotentes (ejecuciones repetidas producen el mismo resultado) y cómo evitar POSTs duplicados, por ejemplo mediante una Idempotency-Key en ciertas operaciones de escritura. Esto reduce duplicados, estados inconsistentes y casos de soporte.
Documentación y pruebas: OpenAPI como base de trabajo común
Una API rara vez es usada por un único equipo en B2B. OpenAPI (Swagger) es un lenguaje común práctico porque las especificaciones se pueden automatizar: generación de clientes, mocking, contract-tests y diffing entre versiones. Aunque el stack Delphi no genere todo automáticamente, vale la pena mantener una especificación como artefacto central.
Cobertura de pruebas pragmática que reduzca costes operativos
Una estructura de pruebas sensata para servicios REST suele constar de tres niveles:
- Unit tests para la lógica de dominio (sin HTTP, sin base de datos)
- Integration tests para acceso a datos y comportamiento transaccional (con base de datos de prueba y datos seed reproducibles)
- API/Contract tests contra un servicio en ejecución (códigos de estado, autenticación, formatos de error, versionado)
Para administradores y equipos de operación lo importante es: las pruebas deben ser reproducibles y no depender de entornos de desarrollador. Cuanto más parecido sea el entorno de prueba al despliegue final, menor será el riesgo de sorpresas tras actualizaciones.
Despliegue y operación: servicio Windows, servicio Linux, contenedores
Un servidor REST se considera en la práctica „listo“ cuando puede operarse de forma estable: comportamiento de inicio/parada, rotación de logs, actualizaciones, permisos, apertura de puertos, certificados, monitorización y opciones claras de rollback.
Servicios Windows y Linux: modelos de operación probados
En Windows operar como servicio Windows es a menudo lo obvio, porque existen mecanismos para tipo de inicio, recuperación, permisos y monitorización. En Linux se utiliza con frecuencia un servicio systemd (systemd es el gestor de servicios estándar) que controla políticas de reinicio, integración de logs y orden de arranque. Para ambos mundos vale: un proxy inverso delante simplifica TLS, políticas de headers, rate limits y routing.
Contenedores: reproducibles, pero solo con separación clara de estado
Los contenedores pueden unificar despliegues y acelerar rollouts. La condición es una separación clara del estado: base de datos externa, ficheros en volúmenes, secretos gestionados mediante un gestor de secretos. Sin esa disciplina surgen estados mixtos difíciles de mantener que causan problemas o complican los restores.
Configuración: trazable, separada por entorno, sin secretos en el repo
Un modelo de configuración consistente ayuda: ajustes separados para Dev/Test/Prod, definición central de niveles de log, datos de conexión a BD, timeouts, origins permitidos y claves de tokens. La información sensible no debe estar en el repositorio de código. Para auditorías y operación es importante que los cambios de configuración sean trazables y puedan desplegarse de forma controlada.
Observability: logs, métricas y tracing como prerrequisito operativo
Cuando las integraciones fallan, el equipo de operación necesita respuestas: ¿qué endpoints están afectados, desde cuándo, con qué tasa de error y qué dependencia está lenta? Sin observability cada incidente se convierte en trabajo detectivesco manual.
Logging estructurado y Correlation-IDs
El logging estructurado (key/value o JSON) permite análisis con herramientas y facilita el filtrado por endpoint, tenant, código de error o Correlation-ID. Cada petición debería recibir una Correlation-ID que también se devuelva en el header de la respuesta. No registre datos sensibles como contraseñas, tokens o contenidos personales; aquí ayudan el enmascaramiento, hashing o logs de depuración en entornos aislados.
Métricas para capacidad y estabilidad
Métricas prácticas y probadas son tasa de requests, latencias (p. ej. p95/p99), tasas de error por endpoint, tiempos de BD, número de workers/hilos activos, ocupación de conexiones y longitudes de colas. Estos valores son la base para la planificación de capacidad y ayudan a detectar problemas progresivos (índices faltantes, nuevas dependencias, rutas de consulta desfavorables).
Camino de modernización: REST como límite estable para sistemas Delphi heredados
En muchas paisajes Delphi la API REST no es el estado final, sino un componente de estabilidad y modernización. Un enfoque probado y de bajo riesgo es por fases:
- Priorizar casos de uso: qué funciones deben estar disponibles externamente (maestros, cambios de estado, acceso a documentos, aprobaciones)
- Definir estándares de API: auth, formato de error, versionado, logging, timeouts, rate limits, OpenAPI
- Extraer dominio: estructurar la lógica de negocio para que no dependa de la UI o de endpoints concretos
- Consolidar acceso a datos: reglas FireDAC, concepto transaccional, líneas base de rendimiento, políticas de consulta
- Migrar consumidores por fases: escritorio, portales y otros servicios consumen la API; los accesos directos a BD se van reduciendo
El resultado es un sistema que puede evolucionar por etapas: los módulos pueden renovarse sin que los cambios se propaguen de forma incontrolada a todos los clientes.
Escollos típicos en proyectos B2B REST
Algunos patrones de error reaparecen y son evitables con reglas claras:
- Formatos de error inconsistentes: complican soporte e integración. Solución: objeto de error estandarizado con códigos de error estables.
- Seguridad como añadido: roles, multitenancy y auditoría se „añaden“ más tarde. Solución: planearlos como estructura base, no improvisarlos por endpoint.
- Sin límites: la falta de límites de body, timeouts y concurrencia provoca fallos bajo carga. Solución: proxy inverso más backpressure del servidor.
- Base de datos demasiado acoplada a la API: cada cambio de esquema rompe consumidores. Solución: DTOs y casos de uso claramente definidos.
- Poca observabilidad: los problemas no son medibles. Solución: Correlation-IDs, logs estructurados, métricas clave.
Conclusión: REST con Delphi implica responsabilidad sobre la interfaz y la operación
Desarrollar un servidor REST con Delphi tiene éxito sostenible en entornos empresariales cuando arquitectura y operación se planifican juntas desde el inicio. La elección del framework (WebBroker, Horse, RAD Server o una migración desde DataSnap) importa, pero no es el mayor factor. Lo que marca la diferencia son estándares claros para diseño de API, autenticación, manejo de errores, versionado, acceso a datos con FireDAC, timeouts, así como observability y despliegue como servicio Windows o Linux. Así una interfaz se convierte en un componente de integración estable que facilita la modernización en lugar de bloquearla.
En el contexto técnico juegan también un papel importante la API Delphi REST y la API Delphi REST y servidores REST cuando integraciones, flujos de datos y evolución deben encajar limpiamente.
Siguiente paso
Cuando el tema se convierte en un proyecto real, la arquitectura, los sistemas existentes y la operación deben considerarse desde el principio.
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 rollout no se posponen como consecuencias tardías.
- Detecta con antelación qué enfoque es viable desde el punto de vista económico y operativo.