ERP completo
Clientes, productos, facturación, gráficos de panel e inicio de sesión con passkey.
Abrir la demo en vivo →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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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();
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.
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.
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.
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.
Las unidades del motor se incluyen con sgcHTML, así que no hay nada extra que instalar para ninguna de las dos vías.
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.
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.
Estas aplicaciones sirven su HTML desde Delphi. El mismo enfoque encaja en un servicio WebBroker o DataSnap existente.
Clientes, productos, facturación, gráficos de panel e inicio de sesión con passkey.
Abrir la demo en vivo →
Métricas enviadas a fragmentos htmx fuera de banda a medida que cambian.
Abrir la demo en vivo →
Un área de autoservicio tras un inicio de sesión, con el mismo conjunto de componentes.
Abrir la demo en vivo →