ERP completo
Clienti, prodotti, fatturazione, grafici della dashboard e accesso con passkey.
Apri la demo live →
sgcHTML non è legato al server sgcWebSockets. Il suo livello di componenti e nodi produce semplici stringhe HTML indipendenti da qualsiasi trasporto, così le stesse pagine che crei per il server HTTP sgcWebSockets possono essere servite da un'applicazione Embarcadero WebBroker e da un server DataSnap. Inserisci un componente engine sul tuo web module, oppure assegnalo a un bridge server, e la tua API REST DataSnap e la tua Web UI sgcHTML girano fianco a fianco su una sola porta.
sgcHTML è un renderer HTML lato server. Ogni componente e ogni nodo emette markup Bootstrap 5 standard come semplice stringa, senza alcuna dipendenza dal trasporto che lo consegna. Ovunque il tuo codice Delphi o C++ Builder possa scrivere una risposta HTTP, può servire una pagina sgcHTML. È questo che permette alla stessa pagina creata per il server sgcWebSockets di girare, invariata, dentro un'applicazione WebBroker o un server DataSnap.
Sia il livello dei componenti sia il livello dei nodi si risolvono in una string di markup Bootstrap 5. Nulla in quell'output presuppone il server sgcWebSockets, quindi puoi scriverla in qualsiasi TWebResponse dal tuo stesso handler.
L'engine WebBroker implementa il contratto standard IWebDispatch. Si inserisce nella normale catena di dispatch di WebBroker come qualsiasi altro componente auto-dispatching, quindi coesiste con le tue action e i tuoi dispatcher esistenti.
Poiché è normale WebBroker, una pagina sgcHTML può essere servita da un TIdHTTPWebBrokerBridge standalone, un modulo ISAPI, un modulo Apache, un eseguibile CGI o un bridge server HTTP.sys. Un solo codebase, diverse forme di deployment.
Ci sono due modi per servire sgcHTML al di fuori del server sgcWebSockets. WebBroker puro ti offre la portata più ampia, da CGI a ISAPI. Il percorso con bridge server aggiunge il push WebSocket in tempo reale e condivide una porta con DataSnap.
TsgcHTMX_Engine_Server_WebBroker implementa lo standard IWebDispatch. Inseriscilo sul tuo TWebModule con il web module come owner, oppure chiama il suo DispatchRequest da un TWebActionItem quando vuoi che la lista delle action venga eseguita prima. In entrambi i casi serve la pagina sgcHTML, gli asset CSS e JavaScript integrati e le route HTTP HTMX che registri sul suo Router. Gira su un TIdHTTPWebBrokerBridge standalone, un modulo ISAPI, un modulo Apache e CGI.
Qui l'interattività è HTMX standard su round-trip HTTP semplici, quindi non serve alcun WebSocket. È supportata anche una classica modalità plain-HTML, senza alcun HTMX, con navigazione a pagina intera e invii di form standard, per host e pagine dove vuoi solo markup. Un aspetto da tenere presente: con WebBroker puro, CGI o ISAPI non c'è push WebSocket, perché il ciclo di vita di richiesta e risposta possiede il socket. Quando ti servono aggiornamenti live su questo percorso, usa il polling HTMX, oppure passa ai bridge server descritti sotto.
TsgcHTMX_Engine_Server_WebBrokerBridge è destinato ai bridge server WebBroker di sgcWebSockets, TsgcWSHTTPWebBrokerBridgeServer su HTTP/1.1 e TsgcWSHTTP2WebBrokerBridgeServer su HTTP/2. TsgcHTMX_Engine_Server_HTTPAPI_WebBrokerBridge è destinato a TsgcWSServer_HTTPAPI_WebBrokerBridge su HTTP.sys. Assegni la proprietà Server dell'engine al tuo bridge server, e la pagina sgcHTML, i suoi asset e il push in tempo reale di frammenti WebSocket tramite BroadcastFragment girano tutti sulla stessa porta degli endpoint REST DataSnap.
L'engine rivendica solo i propri percorsi, quindi le chiamate REST /datasnap/* e le action del tuo TWebModule esistente continuano a funzionare esattamente come prima. Qualsiasi handler OnCommandRequest già assegnato viene concatenato, e il tuo handler viene eseguito per primo, così nulla di ciò che hai costruito viene scavalcato.
Gli stessi metodi del server DataSnap possono servire due pubblici contemporaneamente. Un TDSServerModule è la tua API REST e JSON su /datasnap/rest/... per i client esterni, ed è anche la sorgente dati da cui le tue pagine sgcHTML vengono renderizzate, in-process, sullo stesso server. Scrivi la logica di business una sola volta, poi la raggiungi da un frammento del browser e da un chiamante REST esterno attraverso un'unica classe condivisa.
I client esterni chiamano i tuoi metodi del server su /datasnap/rest/TServerMethods/<Method>/... esattamente come li espone un server DataSnap WebBroker standard. L'engine sgcHTML lascia intatti quei percorsi.
I tuoi handler di route e action chiamano la stessa identica classe di metodi del server in-process, leggono il risultato e lo passano ai componenti sgcHTML. La pagina viene renderizzata dallo stesso identico back end che risponde alla tua API REST.
Sul percorso con bridge server, BroadcastFragment invia nuovo HTML a ogni browser connesso tramite WebSocket, sulla stessa porta e nello stesso processo degli endpoint DataSnap. Dashboard e monitor si aggiornano nell'istante in cui i tuoi dati cambiano.
Crea l'engine, dagli un router e una pagina, e assegnalo a un bridge server per il percorso DataSnap e tempo reale, oppure inseriscilo sul web module per il percorso WebBroker puro.
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();
Ognuno dei percorsi qui sopra è una demo completa ed eseguibile nella distribuzione sgcWebSockets, così puoi partire da un progetto che già si compila ed effettua il dispatch.
Demos\60.HTML\11.WebBroker è un mini CRM su WebBroker con un backend DataSnap e piena interattività HTMX, che mostra l'engine, DataSnap REST e le action standard di WebModule che condividono un unico web module.
Demos\60.HTML\12.WebBrokerHTML serve lo stesso tipo di pagine in classica modalità plain-HTML, con navigazione a pagina intera e invii di form standard su un backend DataSnap, e senza alcun HTMX.
Demos\40.DataSnap\Server_Indy_HTTP_HTML esegue una dashboard sgcHTML live insieme a DataSnap su una sola porta, inviando frammenti di statistiche, grafici e log a ogni browser tramite WebSocket.
Le unit dell'engine sono incluse in sgcHTML, quindi non c'è nulla di extra da installare per nessuno dei due percorsi.
TsgcHTMX_Engine_Server_WebBroker supporta Delphi da 7 a 13. WebBroker è disponibile in ogni edizione di RAD Studio, e lo stesso engine è disponibile in C++ Builder.
I bridge server DataSnap e il livello REST /datasnap/* richiedono un'edizione di Delphi che includa DataSnap, cioè Enterprise o Architect. Il lato sgcHTML del collegamento è lo stesso su entrambi i percorsi.
Queste applicazioni servono il loro HTML da Delphi. Lo stesso approccio si inserisce in un servizio WebBroker o DataSnap esistente.
Clienti, prodotti, fatturazione, grafici della dashboard e accesso con passkey.
Apri la demo live →
Metriche inviate in frammenti htmx out-of-band non appena cambiano.
Apri la demo live →
Un'area self-service dietro un login, che condivide lo stesso set di componenti.
Apri la demo live →