sgcHTML 在 WebBroker 和 DataSnap 上运行 | sgcHTML | eSeGeCe

sgcHTML 在 WebBroker 和 DataSnap 上运行

sgcHTML 并不绑定于 sgcWebSockets 服务器。它的组件层和节点层生成与任何传输无关的纯 HTML 字符串,因此您为 sgcWebSockets HTTP 服务器构建的同一批页面,也可以从 Embarcadero WebBroker 应用程序和 DataSnap 服务器提供。在您的 Web 模块上放置一个引擎组件,或将其分配给一个桥接服务器,您的 DataSnap REST API 和您的 sgcHTML Web UI 便会在同一个端口上并肩运行。

标准 IWebDispatch
DataSnap 单端口
ISAPI / Apache / CGI / HTTP.sys
HTTP/1.1 和 HTTP/2
Delphi 7 至 13

设计上与宿主无关

sgcHTML 是一个服务器端 HTML 渲染器。每个组件和每个节点都以纯字符串形式发出标准的 Bootstrap 5 标记,不依赖于传递它的传输。只要您的 Delphi 或 C++ Builder 代码能够写出 HTTP 响应,它就能提供 sgcHTML 页面。正是这一点让您为 sgcWebSockets 服务器构建的同一个页面,无需修改即可在 WebBroker 应用程序或 DataSnap 服务器内运行。

纯 HTML 字符串

组件层和节点层都会解析为一个 Bootstrap 5 标记的 string。该输出中没有任何内容假定使用 sgcWebSockets 服务器,因此您可以从自己的处理器将它写入任何 TWebResponse

标准 IWebDispatch

WebBroker 引擎实现了标准的 IWebDispatch 契约。它像任何其他自动分发组件一样接入常规的 WebBroker 分发链,因此可与您现有的动作和分发器共存。

WebBroker 在哪里运行,它就在哪里运行

由于它就是普通的 WebBroker,sgcHTML 页面可以从独立的 TIdHTTPWebBrokerBridge、ISAPI 模块、Apache 模块、CGI 可执行文件或 HTTP.sys 桥接服务器提供。一套代码库,多种部署形态。

选择适合您应用的宿主

在 sgcWebSockets 服务器之外,有两种方式提供 sgcHTML。纯 WebBroker 为您带来最广泛的适用范围,从 CGI 到 ISAPI。桥接服务器路径则增加了实时 WebSocket 推送,并与 DataSnap 共享一个端口。

1. 任何 WebBroker 应用程序

TsgcHTMX_Engine_Server_WebBroker 实现了标准的 IWebDispatch。将它放置在您的 TWebModule 上并以该 Web 模块作为其所有者,或者当您希望先运行动作列表时,从一个 TWebActionItem 调用它的 DispatchRequest。无论采用哪种方式,它都会提供 sgcHTML 页面、内置的 CSS 和 JavaScript 资源,以及您在其 Router 上注册的 HTMX HTTP 路由。它可运行在独立的 TIdHTTPWebBrokerBridge、ISAPI 模块、Apache 模块和 CGI 上。

这里的交互性是基于纯 HTTP 往返的标准 HTMX,因此无需 WebSocket。此外还支持经典的纯 HTML 模式,完全不使用 HTMX,采用整页导航和标准表单提交,适用于您只想要标记的宿主和页面。有一点需要事先规划:在纯 WebBroker、CGI 或 ISAPI 下没有 WebSocket 推送,因为请求和响应的生命周期占用了套接字。当您在这条路径上需要实时更新时,请使用 HTMX 轮询,或转向下方的桥接服务器。

2. DataSnap 和桥接服务器,具备实时能力

TsgcHTMX_Engine_Server_WebBrokerBridge 面向 sgcWebSockets 的 WebBroker 桥接服务器,即基于 HTTP/1.1 的 TsgcWSHTTPWebBrokerBridgeServer 和基于 HTTP/2 的 TsgcWSHTTP2WebBrokerBridgeServerTsgcHTMX_Engine_Server_HTTPAPI_WebBrokerBridge 则面向 HTTP.sys 上的 TsgcWSServer_HTTPAPI_WebBrokerBridge。您将引擎的 Server 属性分配给您的桥接服务器,于是 sgcHTML 页面、它的资源,以及通过 BroadcastFragment 进行的实时 WebSocket 片段推送,都会在与您的 DataSnap REST 端点相同的端口上运行。

引擎只认领它自己的路径,因此 /datasnap/* REST 调用和您现有的 TWebModule 动作会像以前一样继续工作。您已经分配的任何 OnCommandRequest 处理器都会被链接,并且您的处理器会先运行,因此您所构建的一切都不会被接管。

您的 DataSnap 方法既是 API,也是页面数据

同一批 DataSnap 服务器方法可以同时服务于两类受众。一个 TDSServerModule 是您面向外部客户端、位于 /datasnap/rest/... 的 REST 和 JSON API,同时它也是您的 sgcHTML 页面所渲染的数据源,在同一台服务器上进程内运行。您只需编写一次业务逻辑,然后通过一个共享的类,既从浏览器片段访问它,也从外部 REST 调用方访问它。

REST / JSON API

外部客户端在 /datasnap/rest/TServerMethods/<Method>/... 调用您的服务器方法,与标准 DataSnap WebBroker 服务器公开它们的方式完全一致。sgcHTML 引擎不会触碰这些路径。

服务器渲染的页面数据

您的路由和动作处理器在进程内调用同一个服务器方法类,读取结果,并将其交给 sgcHTML 组件。页面所渲染自的后端,与响应您 REST API 的后端完全相同。

实时推送,同一端口

在桥接服务器路径上,BroadcastFragment 通过 WebSocket 向每个已连接的浏览器推送新的 HTML,使用与您的 DataSnap 端点相同的端口和进程。仪表板和监控器会在您的数据变化的瞬间更新。

将引擎接入您的宿主

创建引擎,为它提供一个路由器和一个页面,然后将它分配给一个桥接服务器以走 DataSnap 和实时路径,或者将它放置在 Web 模块上以走纯 WebBroker 路径。

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

产品附带三个演示

上述每一条路径在 sgcWebSockets 发行包中都是一个完整、可运行的演示,因此您可以从一个已经能够构建和分发的项目开始。

WebBroker + DataSnap,HTMX

Demos\60.HTML\11.WebBroker 是一个基于 WebBroker、带有 DataSnap 后端和完整 HTMX 交互能力的迷你 CRM,展示了引擎、DataSnap REST 和标准 WebModule 动作共享一个 Web 模块。

经典纯 HTML,无 HTMX

Demos\60.HTML\12.WebBrokerHTML 以经典的纯 HTML 模式提供同类页面,在 DataSnap 后端之上采用整页导航和标准表单提交,完全不使用 HTMX。

单端口上的实时仪表板

Demos\40.DataSnap\Server_Indy_HTTP_HTML 在单个端口上让一个实时的 sgcHTML 仪表板与 DataSnap 并肩运行,通过 WebSocket 向每个浏览器推送统计、图表和日志片段。

您需要什么

引擎单元随 sgcHTML 一起提供,因此无论走哪条路径都无需额外安装任何东西。

纯 WebBroker 路径

TsgcHTMX_Engine_Server_WebBroker 支持 Delphi 7 到 Delphi 13。WebBroker 在每个 RAD Studio 版本中都可用,并且同一个引擎在 C++ Builder 中同样可用。

DataSnap 桥接路径

DataSnap 桥接服务器和 /datasnap/* REST 层需要包含 DataSnap 的 Delphi 版本,也就是 Enterprise 或 Architect。而接线中的 sgcHTML 部分在两条路径上都是相同的。

超值之选:All-AccesseSeGeCe 全部产品,含高级支持,每年 €1,059 起。
查看 All-Access 价格

为您的 WebBroker 或 DataSnap 服务器添加 Web 界面

用您在 sgcHTML 中随处使用的同一套组件 API,从您已经在运行的 WebBroker 应用程序或 DataSnap 服务器提供实时的 Bootstrap 5 页面。