sgcHTML no WebBroker & DataSnap | sgcHTML | eSeGeCe

sgcHTML no WebBroker & DataSnap

O sgcHTML não está preso ao servidor sgcWebSockets. Sua camada de componentes e de nós produz strings de HTML puro que independem de qualquer transporte, então as mesmas páginas que você constrói para o servidor HTTP do sgcWebSockets podem ser servidas a partir de uma aplicação WebBroker da Embarcadero e de um servidor DataSnap. Adicione um componente de motor ao seu web module, ou atribua-o a um servidor-ponte, e sua API REST DataSnap e sua UI web sgcHTML rodam lado a lado em uma única porta.

IWebDispatch padrão
DataSnap em uma porta
ISAPI / Apache / CGI / HTTP.sys
HTTP/1.1 & HTTP/2
Delphi 7 ao 13

Agnóstico de Host por Design

O sgcHTML é um renderizador de HTML server-side. Cada componente e cada nó emite markup Bootstrap 5 padrão como uma string simples, sem nenhuma dependência do transporte que o entrega. Onde quer que o seu código Delphi ou C++ Builder possa escrever uma resposta HTTP, ele pode servir uma página sgcHTML. É isso que permite que a mesma página que você construiu para o servidor sgcWebSockets rode, sem alterações, dentro de uma aplicação WebBroker ou de um servidor DataSnap.

Strings de HTML puro

Tanto a camada de componentes quanto a camada de nós resolvem para uma string de markup Bootstrap 5. Nada nessa saída pressupõe o servidor sgcWebSockets, então você pode gravá-la em qualquer TWebResponse a partir do seu próprio handler.

IWebDispatch padrão

O motor WebBroker implementa o contrato padrão IWebDispatch. Ele se conecta à cadeia normal de despacho do WebBroker como qualquer outro componente de auto-despacho, então coexiste com suas actions e dispatchers existentes.

Roda onde o WebBroker roda

Por ser WebBroker comum, uma página sgcHTML pode ser servida a partir de um TIdHTTPWebBrokerBridge standalone, um módulo ISAPI, um módulo Apache, um executável CGI ou um servidor-ponte HTTP.sys. Uma única base de código, vários formatos de implantação.

Escolha o Host Que Combina com Sua Aplicação

Há duas maneiras de servir o sgcHTML fora do servidor sgcWebSockets. O WebBroker puro oferece o maior alcance, de CGI a ISAPI. O caminho com servidor-ponte adiciona push em tempo real por WebSocket e compartilha uma porta com o DataSnap.

1. Qualquer aplicação WebBroker

TsgcHTMX_Engine_Server_WebBroker implementa o IWebDispatch padrão. Adicione-o ao seu TWebModule com o web module como owner, ou chame o seu DispatchRequest a partir de um TWebActionItem quando quiser que a lista de actions rode primeiro. De qualquer forma, ele serve a página sgcHTML, os assets CSS e JavaScript integrados e as rotas HTTP do HTMX que você registra no seu Router. Ele roda em um TIdHTTPWebBrokerBridge standalone, um módulo ISAPI, um módulo Apache e CGI.

A interatividade aqui é HTMX padrão sobre round-trips HTTP simples, então nenhum WebSocket é necessário. Um modo clássico de HTML puro também é suportado, sem nenhum HTMX, com navegação de página inteira e envios de formulário padrão, para hosts e páginas onde você quer apenas markup. Um detalhe a planejar: sob WebBroker puro, CGI ou ISAPI não há push por WebSocket, porque o ciclo de vida de requisição e resposta é dono do socket. Quando você precisar de atualizações ao vivo neste caminho, use polling do HTMX, ou migre para os servidores-ponte abaixo.

2. DataSnap e os servidores-ponte, com tempo real

TsgcHTMX_Engine_Server_WebBrokerBridge tem como alvo os servidores-ponte WebBroker do sgcWebSockets, TsgcWSHTTPWebBrokerBridgeServer sobre HTTP/1.1 e TsgcWSHTTP2WebBrokerBridgeServer sobre HTTP/2. TsgcHTMX_Engine_Server_HTTPAPI_WebBrokerBridge tem como alvo o TsgcWSServer_HTTPAPI_WebBrokerBridge sobre HTTP.sys. Você atribui a propriedade Server do motor ao seu servidor-ponte, e a página sgcHTML, seus assets e o push de fragmentos ao vivo por WebSocket através do BroadcastFragment rodam todos na mesma porta dos seus endpoints REST DataSnap.

O motor reivindica apenas os seus próprios paths, então as chamadas REST em /datasnap/* e suas actions existentes de TWebModule continuam funcionando exatamente como antes. Qualquer handler OnCommandRequest que você já tenha atribuído é encadeado, e o seu handler roda primeiro, então nada do que você construiu é substituído.

Seus Métodos DataSnap São Ao Mesmo Tempo a API e os Dados da Página

Os mesmos métodos de servidor DataSnap podem atender a duas audiências de uma só vez. Um TDSServerModule é a sua API REST e JSON em /datasnap/rest/... para clientes externos, e é também a fonte de dados a partir da qual suas páginas sgcHTML são renderizadas, in-process, no mesmo servidor. Você escreve a lógica de negócio uma vez, e então a alcança a partir de um fragmento no navegador e de um chamador REST externo através de uma única classe compartilhada.

REST / JSON API

Clientes externos chamam seus métodos de servidor em /datasnap/rest/TServerMethods/<Method>/... exatamente como um servidor DataSnap WebBroker padrão os expõe. O motor sgcHTML deixa esses paths intactos.

Dados de página renderizados no servidor

Seus handlers de rota e de action chamam a mesma classe de métodos de servidor in-process, leem o resultado e o entregam aos componentes sgcHTML. A página é renderizada a partir do mesmo back end que responde à sua API REST.

Push ao vivo, mesma porta

No caminho com servidor-ponte, o BroadcastFragment envia novo HTML a cada navegador conectado por WebSockets, na mesma porta e processo dos seus endpoints DataSnap. Dashboards e monitores atualizam no instante em que seus dados mudam.

Conecte o Motor ao Seu Host

Crie o motor, dê a ele um router e uma página, e atribua-o a um servidor-ponte para o caminho DataSnap e de tempo real, ou adicione-o ao web module para o caminho 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();

Três Demos Acompanham o Produto

Cada um dos caminhos acima é um demo completo e executável na distribuição do sgcWebSockets, então você pode começar a partir de um projeto que já compila e despacha.

WebBroker + DataSnap, HTMX

Demos\60.HTML\11.WebBroker é um mini CRM em WebBroker com um back end DataSnap e interatividade HTMX completa, mostrando o motor, o REST do DataSnap e actions padrão de WebModule compartilhando um único web module.

HTML puro clássico, sem HTMX

Demos\60.HTML\12.WebBrokerHTML serve o mesmo tipo de páginas em modo clássico de HTML puro, com navegação de página inteira e envios de formulário padrão sobre um back end DataSnap, e sem nenhum HTMX.

Dashboard em tempo real em uma porta

Demos\40.DataSnap\Server_Indy_HTTP_HTML roda um dashboard sgcHTML ao vivo junto do DataSnap em uma única porta, enviando fragmentos de estatísticas, gráficos e logs a cada navegador por WebSockets.

O Que Você Precisa

As units do motor acompanham o sgcHTML, então não há nada extra para instalar em nenhum dos caminhos.

Caminho WebBroker puro

TsgcHTMX_Engine_Server_WebBroker suporta do Delphi 7 ao Delphi 13. O WebBroker está disponível em todas as edições do RAD Studio, e o mesmo motor está disponível no C++ Builder.

Caminho da ponte DataSnap

Os servidores-ponte DataSnap e a camada REST em /datasnap/* exigem uma edição do Delphi que inclua o DataSnap, isto é, Enterprise ou Architect. O lado sgcHTML da configuração é o mesmo em ambos os caminhos.

Melhor custo-benefício: All-AccessTodos os produtos da eSeGeCe, com Suporte Premium incluído, a partir de €1,059/ano.
Ver preços do All-Access

Adicione uma UI Web ao Seu Servidor WebBroker ou DataSnap

Sirva páginas Bootstrap 5 em tempo real a partir da aplicação WebBroker ou do servidor DataSnap que você já executa, com a mesma API de componentes que você usa em todo o resto do sgcHTML.