sgcHTML op WebBroker & DataSnap | sgcHTML | eSeGeCe

sgcHTML op WebBroker & DataSnap

sgcHTML is niet gebonden aan de sgcWebSockets-server. De component- en node-laag produceert platte HTML-strings die onafhankelijk zijn van elk transport, zodat dezelfde pagina's die je voor de sgcWebSockets-HTTP-server bouwt, ook vanuit een Embarcadero WebBroker-applicatie en vanuit een DataSnap-server kunnen worden geserveerd. Plaats één engine-component op je web module, of koppel het aan een bridge-server, en je DataSnap REST-API en je sgcHTML-web-UI draaien naast elkaar op één poort.

Standaard IWebDispatch
DataSnap op één poort
ISAPI / Apache / CGI / HTTP.sys
HTTP/1.1 & HTTP/2
Delphi 7 tot 13

Host-onafhankelijk van ontwerp

sgcHTML is een server-side HTML-renderer. Elk component en elke node stuurt standaard Bootstrap 5-markup uit als een platte string, zonder afhankelijkheid van het transport dat het aflevert. Overal waar je Delphi- of C++ Builder-code een HTTP-respons kan schrijven, kan het een sgcHTML-pagina serveren. Daardoor draait dezelfde pagina die je voor de sgcWebSockets-server bouwde, ongewijzigd, in een WebBroker-applicatie of een DataSnap-server.

Platte HTML-strings

De componentlaag en de node-laag resulteren beide in een string met Bootstrap 5-markup. Niets in die uitvoer veronderstelt de sgcWebSockets-server, dus je kunt het vanuit je eigen handler naar elke TWebResponse schrijven.

Standaard IWebDispatch

De WebBroker-engine implementeert het standaard IWebDispatch-contract. Het klikt in de normale WebBroker-dispatchketen als elk ander auto-dispatchend component, zodat het samenwerkt met je bestaande actions en dispatchers.

Draait waar WebBroker draait

Omdat het gewone WebBroker is, kan een sgcHTML-pagina worden geserveerd vanuit een standalone TIdHTTPWebBrokerBridge, een ISAPI-module, een Apache-module, een CGI-executable of een HTTP.sys-bridge-server. Eén codebase, meerdere deployment-vormen.

Kies de host die bij je app past

Er zijn twee manieren om sgcHTML buiten de sgcWebSockets-server te serveren. Gewone WebBroker geeft je het grootste bereik, van CGI tot ISAPI. Het bridge-serverpad voegt live WebSocket-push toe en deelt een poort met DataSnap.

1. Elke WebBroker-applicatie

TsgcHTMX_Engine_Server_WebBroker implementeert het standaard IWebDispatch. Plaats het op je TWebModule met de web module als owner, of roep zijn DispatchRequest aan vanuit een TWebActionItem wanneer je de actielijst eerst wilt laten draaien. Hoe dan ook serveert het de sgcHTML-pagina, de ingebouwde CSS- en JavaScript-assets en de HTMX-HTTP-routes die je op zijn Router registreert. Het draait op een standalone TIdHTTPWebBrokerBridge, een ISAPI-module, een Apache-module en CGI.

Interactiviteit is hier standaard HTMX over gewone HTTP-round-trips, dus er is geen WebSocket vereist. Er is ook een klassieke plain-HTML-modus, helemaal zonder HTMX, met volledige paginanavigatie en standaard formulierposts, voor hosts en pagina's waar je niets dan markup wilt. Eén kanttekening om rekening mee te houden: onder gewone WebBroker, CGI of ISAPI is er geen WebSocket-push, omdat de levenscyclus van verzoek en respons de socket bezit. Wanneer je op dit pad live updates nodig hebt, gebruik dan HTMX-polling, of stap over naar de bridge-servers hieronder.

2. DataSnap en de bridge-servers, met realtime

TsgcHTMX_Engine_Server_WebBrokerBridge richt zich op de sgcWebSockets WebBroker-bridge-servers, TsgcWSHTTPWebBrokerBridgeServer over HTTP/1.1 en TsgcWSHTTP2WebBrokerBridgeServer over HTTP/2. TsgcHTMX_Engine_Server_HTTPAPI_WebBrokerBridge richt zich op TsgcWSServer_HTTPAPI_WebBrokerBridge op HTTP.sys. Je kent de Server-eigenschap van de engine toe aan je bridge-server, en de sgcHTML-pagina, zijn assets en live WebSocket-fragmentpush via BroadcastFragment draaien allemaal op dezelfde poort als je DataSnap REST-endpoints.

De engine claimt alleen zijn eigen paden, dus /datasnap/* REST-aanroepen en je bestaande TWebModule-actions blijven precies zoals voorheen werken. Elke OnCommandRequest-handler die je al hebt toegewezen, wordt aan elkaar geketend, en jouw handler draait eerst, zodat niets van wat je hebt gebouwd wordt overgenomen.

Je DataSnap-methoden zijn zowel de API als de paginadata

Dezelfde DataSnap-servermethoden kunnen twee doelgroepen tegelijk bedienen. Een TDSServerModule is je REST- en JSON-API op /datasnap/rest/... voor externe clients, en het is ook de databron waaruit je sgcHTML-pagina's renderen, in-process, op dezelfde server. Je schrijft de bedrijfslogica één keer en bereikt die vervolgens vanuit een browserfragment en vanuit een externe REST-aanroeper via één gedeelde class.

REST / JSON API

Externe clients roepen je servermethoden aan op /datasnap/rest/TServerMethods/<Method>/... precies zoals een standaard DataSnap WebBroker-server ze blootstelt. De sgcHTML-engine laat die paden ongemoeid.

Server-gerenderde paginadata

Je route- en action-handlers roepen exact dezelfde servermethode-class in-process aan, lezen het resultaat en geven het door aan sgcHTML-componenten. De pagina rendert vanuit dezelfde back-end die je REST-API beantwoordt.

Live push, dezelfde poort

Op het bridge-serverpad pusht BroadcastFragment nieuwe HTML naar elke verbonden browser over WebSockets, op dezelfde poort en hetzelfde proces als je DataSnap-endpoints. Dashboards en monitors werken bij op het moment dat je data verandert.

Koppel de engine aan je host

Maak de engine aan, geef hem een router en een pagina, en koppel hem aan een bridge-server voor het DataSnap- en realtime-pad, of plaats hem op de web module voor het gewone WebBroker-pad.

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();

Drie demo's worden met het product meegeleverd

Elk van de bovenstaande paden is een complete, uitvoerbare demo in de sgcWebSockets-distributie, zodat je kunt starten vanuit een project dat al bouwt en dispatcht.

WebBroker + DataSnap, HTMX

Demos\60.HTML\11.WebBroker is een mini-CRM op WebBroker met een DataSnap-back-end en volledige HTMX-interactiviteit, die laat zien hoe de engine, DataSnap REST en standaard WebModule-actions één web module delen.

Klassieke plain HTML, geen HTMX

Demos\60.HTML\12.WebBrokerHTML serveert hetzelfde soort pagina's in klassieke plain-HTML-modus, met volledige paginanavigatie en standaard formulierposts over een DataSnap-back-end, en helemaal zonder HTMX.

Realtime dashboard op één poort

Demos\40.DataSnap\Server_Indy_HTTP_HTML draait een live sgcHTML-dashboard naast DataSnap op één poort en pusht stat-, grafiek- en logfragmenten naar elke browser over WebSockets.

Wat je nodig hebt

De engine-units worden met sgcHTML meegeleverd, dus er is voor geen van beide paden iets extra's te installeren.

Gewone WebBroker-pad

TsgcHTMX_Engine_Server_WebBroker ondersteunt Delphi 7 tot en met Delphi 13. WebBroker is beschikbaar in elke RAD Studio-editie, en dezelfde engine is beschikbaar in C++ Builder.

DataSnap-bridge-pad

De DataSnap-bridge-servers en de /datasnap/* REST-laag vereisen een Delphi-editie die DataSnap bevat, dat is Enterprise of Architect. De sgcHTML-kant van de koppeling is op beide paden hetzelfde.

De beste deal: All-AccessElk eSeGeCe-product, inclusief Premium-ondersteuning, vanaf €1,059 per jaar.
Bekijk de All-Access-prijzen

Voeg een web-UI toe aan je WebBroker- of DataSnap-server

Serveer realtime Bootstrap 5-pagina's vanuit de WebBroker-applicatie of DataSnap-server die je al draait, met dezelfde component-API die je overal elders in sgcHTML gebruikt.