sgcHTML en WebBroker y DataSnap | sgcHTML | eSeGeCe

sgcHTML en WebBroker y DataSnap

sgcHTML no está atado al servidor sgcWebSockets. Su capa de componentes y de nodos produce cadenas de HTML simple que son independientes de cualquier transporte, de modo que las mismas páginas que construyes para el servidor HTTP de sgcWebSockets pueden servirse desde una aplicación WebBroker de Embarcadero y desde un servidor DataSnap. Coloca un componente de motor en tu módulo web, o asígnalo a un servidor puente, y tu API REST de DataSnap y tu UI web de sgcHTML se ejecutan una al lado de la otra en un único puerto.

IWebDispatch estándar
DataSnap en un solo puerto
ISAPI / Apache / CGI / HTTP.sys
HTTP/1.1 y HTTP/2
Delphi 7 a 13

Independiente del host por diseño

sgcHTML es un renderizador de HTML del lado del servidor. Cada componente y cada nodo emite marcado estándar de Bootstrap 5 como una cadena simple, sin dependencia del transporte que la entrega. Allí donde tu código de Delphi o C++ Builder pueda escribir una respuesta HTTP, puede servir una página de sgcHTML. Eso es lo que permite que la misma página que construiste para el servidor sgcWebSockets se ejecute, sin cambios, dentro de una aplicación WebBroker o un servidor DataSnap.

Cadenas de HTML simple

Tanto la capa de componentes como la de nodos se resuelven en una string de marcado Bootstrap 5. Nada en esa salida presupone el servidor sgcWebSockets, así que puedes escribirla en cualquier TWebResponse desde tu propio manejador.

IWebDispatch estándar

El motor WebBroker implementa el contrato estándar IWebDispatch. Se conecta a la cadena de despacho normal de WebBroker como cualquier otro componente de despacho automático, de modo que coexiste con tus acciones y despachadores existentes.

Se ejecuta donde se ejecuta WebBroker

Como es WebBroker corriente, una página de sgcHTML puede servirse desde un TIdHTTPWebBrokerBridge independiente, un módulo ISAPI, un módulo Apache, un ejecutable CGI o un servidor puente HTTP.sys. Una sola base de código, varias formas de despliegue.

Elige el host que encaja con tu aplicación

Hay dos formas de servir sgcHTML fuera del servidor sgcWebSockets. WebBroker simple te da el mayor alcance, desde CGI hasta ISAPI. La vía del servidor puente añade envío en directo por WebSocket y comparte puerto con DataSnap.

1. Cualquier aplicación WebBroker

TsgcHTMX_Engine_Server_WebBroker implementa el estándar IWebDispatch. Colócalo en tu TWebModule con el módulo web como propietario, o llama a su DispatchRequest desde un TWebActionItem cuando quieras que la lista de acciones se ejecute primero. En cualquier caso sirve la página de sgcHTML, los recursos CSS y JavaScript integrados y las rutas HTTP de HTMX que registras en su Router. Se ejecuta en un TIdHTTPWebBrokerBridge independiente, un módulo ISAPI, un módulo Apache y CGI.

La interactividad aquí es HTMX estándar sobre viajes de ida y vuelta de HTTP simple, así que no se requiere WebSocket. También se admite un modo clásico de HTML simple, sin nada de HTMX, con navegación de página completa y envíos de formulario estándar, para hosts y páginas donde no quieres más que marcado. Una salvedad que conviene prever: bajo WebBroker simple, CGI o ISAPI no hay envío por WebSocket, porque el ciclo de vida de la petición y la respuesta es dueño del socket. Cuando necesites actualizaciones en directo por esta vía, usa el sondeo de HTMX, o pásate a los servidores puente de abajo.

2. DataSnap y los servidores puente, con tiempo real

TsgcHTMX_Engine_Server_WebBrokerBridge apunta a los servidores puente WebBroker de sgcWebSockets, TsgcWSHTTPWebBrokerBridgeServer sobre HTTP/1.1 y TsgcWSHTTP2WebBrokerBridgeServer sobre HTTP/2. TsgcHTMX_Engine_Server_HTTPAPI_WebBrokerBridge apunta a TsgcWSServer_HTTPAPI_WebBrokerBridge sobre HTTP.sys. Asignas la propiedad Server del motor a tu servidor puente, y la página de sgcHTML, sus recursos y el envío de fragmentos en directo por WebSocket mediante BroadcastFragment se ejecutan todos en el mismo puerto que tus endpoints REST de DataSnap.

El motor reclama solo sus propias rutas, así que las llamadas REST a /datasnap/* y tus acciones existentes de TWebModule siguen funcionando exactamente como antes. Cualquier manejador OnCommandRequest que ya hubieras asignado se encadena, y tu manejador se ejecuta primero, de modo que nada de lo que construiste queda desplazado.

Tus métodos de DataSnap son a la vez la API y los datos de la página

Los mismos métodos del servidor DataSnap pueden servir a dos audiencias a la vez. Un TDSServerModule es tu API REST y JSON en /datasnap/rest/... para clientes externos, y también es la fuente de datos a partir de la cual se renderizan tus páginas de sgcHTML, en proceso, en el mismo servidor. Escribes la lógica de negocio una vez y luego la alcanzas desde un fragmento del navegador y desde un llamador REST externo a través de una única clase compartida.

API REST / JSON

Los clientes externos llaman a tus métodos del servidor en /datasnap/rest/TServerMethods/<Method>/... exactamente como los expone un servidor DataSnap WebBroker estándar. El motor de sgcHTML deja esas rutas intactas.

Datos de página renderizados en el servidor

Tus manejadores de rutas y de acciones llaman a la mismísima clase de métodos del servidor en proceso, leen el resultado y se lo pasan a los componentes de sgcHTML. La página se renderiza a partir del back end idéntico que responde a tu API REST.

Envío en directo, mismo puerto

En la vía del servidor puente, BroadcastFragment envía HTML nuevo a cada navegador conectado a través de WebSockets, en el mismo puerto y proceso que tus endpoints de DataSnap. Los paneles y los monitores se actualizan en el instante en que cambian tus datos.

Conecta el motor a tu host

Crea el motor, dale un router y una página, y asígnalo a un servidor puente para la vía de DataSnap y tiempo real, o colócalo en el módulo web para la vía de WebBroker simple.

uses
  Web.HTTPApp, sgcWebSocket_Server_WebBrokerBridge,
  sgcHTMX_Engine_Server_WebBrokerBridge, sgcHTMX_Router;

// === DataSnap + realtime: sgcHTML on the SAME port as the DataSnap REST API ===
FServer := TsgcWSHTTPWebBrokerBridgeServer.Create(Self);
FServer.Port := 8080;

// a router holds the HTMX fragment routes (GET / POST round-trips)
FRouter := TsgcHTMX_Router.Create(Self);
oRoute := FRouter.Routes.Add;
oRoute.Path := '/dashboard/refresh';
oRoute.OnRoute := OnDashboardRefresh;

// the engine claims its own page, assets and routes; DataSnap keeps /datasnap/*
FEngine := TsgcHTMX_Engine_Server_WebBrokerBridge.Create(Self);
FEngine.Router := FRouter;
FEngine.Template.Title := 'DataSnap Realtime Dashboard';
FEngine.Template.BodyContent := BuildDashboard;   // page built from components
FEngine.Server := FServer;                         // share the DataSnap port

FServer.Active := True;

// push a live HTML fragment to every connected browser over WebSockets
FEngine.BroadcastFragment(BuildStatsFragment);

// === Plain WebBroker: drop the engine on the TWebModule (standard IWebDispatch) ===
FEngine := TsgcHTMX_Engine_Server_WebBroker.Create(WebModule1);  // Owner = WebModule
FEngine.Router := FRouter;
// includes: sgcWebSocket_Server_WebBrokerBridge.hpp,
//           sgcHTMX_Engine_Server_WebBrokerBridge.hpp, sgcHTMX_Router.hpp

// === DataSnap + realtime: sgcHTML on the SAME port as the DataSnap REST API ===
FServer = new TsgcWSHTTPWebBrokerBridgeServer(this);
FServer->Port = 8080;

// a router holds the HTMX fragment routes (GET / POST round-trips)
FRouter = new TsgcHTMX_Router(this);
TsgcHTMX_Route *oRoute = FRouter->Routes->Add();
oRoute->Path = "/dashboard/refresh";
oRoute->OnRoute = OnDashboardRefresh;

// the engine claims its own page, assets and routes; DataSnap keeps /datasnap/*
FEngine = new TsgcHTMX_Engine_Server_WebBrokerBridge(this);
FEngine->Router = FRouter;
FEngine->Template->Title = "DataSnap Realtime Dashboard";
FEngine->Template->BodyContent = BuildDashboard();   // page built from components
FEngine->Server = FServer;                           // share the DataSnap port

FServer->Active = true;

// push a live HTML fragment to every connected browser over WebSockets
FEngine->BroadcastFragment(BuildStatsFragment());

// === Plain WebBroker: drop the engine on the TWebModule (standard IWebDispatch) ===
FEngine = new TsgcHTMX_Engine_Server_WebBroker(WebModule1);  // Owner = WebModule
FEngine->Router = FRouter;
// WebBroker and DataSnap are Delphi and C++ Builder (VCL) frameworks.
// .NET has no WebBroker and no DataSnap, so this hosting path is specific
// to Delphi and C++ Builder. The sgcHTML .NET port hosts on ASP.NET Core.

using esegece.sgcHTML;
using esegece.sgcHTML.AspNetCore;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

// the sgcHTML.AspNetCore adapter maps the same component-built page
// onto an ASP.NET Core endpoint (Kestrel / IIS), the .NET equivalent
// of the WebBroker host used in Delphi and C++ Builder.
app.UseSgcHtml(engine =>
{
    engine.MapPage("/", () => BuildDashboard());
});

app.Run();

El producto incluye tres demos

Cada una de las vías anteriores es una demo completa y ejecutable en la distribución de sgcWebSockets, de modo que puedes partir de un proyecto que ya compila y despacha.

WebBroker + DataSnap, HTMX

Demos\60.HTML\11.WebBroker es un mini CRM sobre WebBroker con un back end DataSnap e interactividad HTMX completa, que muestra el motor, DataSnap REST y las acciones estándar de WebModule compartiendo un único módulo web.

HTML simple clásico, sin HTMX

Demos\60.HTML\12.WebBrokerHTML sirve el mismo tipo de páginas en modo clásico de HTML simple, con navegación de página completa y envíos de formulario estándar sobre un back end DataSnap, y sin nada de HTMX.

Panel en tiempo real en un solo puerto

Demos\40.DataSnap\Server_Indy_HTTP_HTML ejecuta un panel de sgcHTML en directo junto a DataSnap en un solo puerto, enviando fragmentos de estadísticas, gráficos y registros a cada navegador a través de WebSockets.

Lo que necesitas

Las unidades del motor se incluyen con sgcHTML, así que no hay nada extra que instalar para ninguna de las dos vías.

Vía de WebBroker simple

TsgcHTMX_Engine_Server_WebBroker es compatible con Delphi 7 hasta Delphi 13. WebBroker está disponible en todas las ediciones de RAD Studio, y el mismo motor está disponible en C++ Builder.

Vía del puente DataSnap

Los servidores puente de DataSnap y la capa REST de /datasnap/* requieren una edición de Delphi que incluya DataSnap, es decir, Enterprise o Architect. El lado de sgcHTML del cableado es el mismo en ambas vías.

La mejor opción: All-AccessTodos los productos de eSeGeCe, con Premium Support incluido, desde €1,059 al año.
Ver precios de All-Access

Añade una UI web a tu servidor WebBroker o DataSnap

Sirve páginas Bootstrap 5 en tiempo real desde la aplicación WebBroker o el servidor DataSnap que ya tienes en marcha, con la misma API de componentes que usas en todo lo demás de sgcHTML.