sgcHTML su WebBroker & DataSnap | sgcHTML | eSeGeCe

sgcHTML su WebBroker & DataSnap

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.

IWebDispatch standard
DataSnap su una sola porta
ISAPI / Apache / CGI / HTTP.sys
HTTP/1.1 & HTTP/2
Delphi da 7 a 13

Indipendente dall'host per progettazione

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.

Semplici stringhe HTML

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.

IWebDispatch standard

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.

Gira dove gira WebBroker

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.

Scegli l'host adatto alla tua app

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.

1. Qualsiasi applicazione WebBroker

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.

2. DataSnap e i bridge server, con tempo reale

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.

I tuoi metodi DataSnap sono sia l'API sia i dati della pagina

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.

API REST / JSON

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.

Dati di pagina renderizzati dal server

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.

Push live, stessa porta

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.

Collega l'engine al tuo host

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

Tre demo incluse nel prodotto

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.

WebBroker + DataSnap, HTMX

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.

HTML puro classico, senza HTMX

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.

Dashboard in tempo reale su una sola porta

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.

Cosa ti serve

Le unit dell'engine sono incluse in sgcHTML, quindi non c'è nulla di extra da installare per nessuno dei due percorsi.

Percorso WebBroker puro

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.

Percorso bridge DataSnap

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.

La scelta più conveniente: All-AccessTutti i prodotti eSeGeCe, con Supporto Premium incluso, a partire da €1,059/anno.
Vedi i prezzi All-Access

Aggiungi una Web UI al tuo server WebBroker o DataSnap

Servi pagine Bootstrap 5 in tempo reale dall'applicazione WebBroker o dal server DataSnap che già utilizzi, con la stessa API di componenti che usi ovunque in sgcHTML.