WebBroker 与 DataSnap 上的 sgcHTML | eSeGeCe 博客

WebBroker 与 DataSnap 上的 sgcHTML

· 功能

sgcHTML 让你能够在 Delphi 中用组件构建 Web 界面,无需编写任何 JavaScript。到目前为止,这些页面运行在 sgcWebSockets 服务器上。现在你可以从任何 Embarcadero WebBroker 应用程序以及 DataSnap 服务器提供相同的页面,因此现有的 REST 后端无需离开 Delphi 即可发展出完整的 Web 前端。详细信息、组件和代码都在全新的 WebBroker & DataSnap 页面上。

这之所以可行,是因为 sgcHTML 是一个渲染器,而不是一个服务器。组件与节点层将你的页面转换为纯 HTML 字符串,不依赖任何套接字、传输或服务器类。该字符串既可以作为 WebSocket 服务器的响应,也可以同样轻松地作为 TWebResponse 的正文,这正是下面两种集成得以实现的原因。

任意 WebBroker 应用程序

TsgcHTMX_Engine_Server_WebBroker 组件实现了标准的 IWebDispatch 接口。把它放到你的 TWebModule 上,或者从 TWebActionItem 调用它的 DispatchRequest,它就会提供 sgcHTML 页面、内置的 CSS 和 JavaScript 资源以及你的 htmx 路由。它可以运行在独立的 TIdHTTPWebBrokerBridge 上、在 ISAPI 下、在 Apache 模块下以及作为 CGI 运行,因此它能适配你已经部署的任何 WebBroker 宿主。

uses
  Web.HTTPApp, sgcHTMX_Engine_Server_WebBroker, sgcHTMX_Router;

// Any WebBroker host: the engine's Owner is the web module,
// so the standard WebBroker dispatcher calls it automatically
FEngine := TsgcHTMX_Engine_Server_WebBroker.Create(WebModule1);
FEngine.Router := FRouter;   // your htmx routes and the page

交互使用普通的 htmx HTTP 往返,因此不需要 WebSocket。如果你愿意,还有一种完全不使用 htmx 的经典模式,采用纯整页导航和标准表单提交,即使关闭 JavaScript 也能工作。纯 WebBroker 唯一做不到的是推送,因为在 CGI 和 ISAPI 下,请求和响应拥有套接字。要在纯 WebBroker 宿主上进行实时更新,请使用 htmx 轮询,或者转向下面的桥接服务器。

DataSnap,在同一个端口上进行实时更新

sgcWebSockets 已经提供了即插即用的桥接服务器,可以替换 DataSnap 或 WebBroker 应用程序中的 Indy TIdHTTPWebBrokerBridge,使服务器在同一个端口上获得 WebSocket、HTTP/2 或 HTTP.sys 能力。sgcHTML 现在可以直接接入它们。将引擎的 Server 分配给你的桥接服务器,页面、其资源以及实时 WebSocket 片段推送就都会与你的 DataSnap REST 端点运行在同一个端口上。

uses
  sgcWebSocket_Server_WebBrokerBridge,
  sgcHTMX_Engine_Server_WebBrokerBridge, sgcHTMX_Router;

// A DataSnap / WebBroker bridge server
FServer := TsgcWSHTTPWebBrokerBridgeServer.Create(Self);
FServer.Port := 8080;

FEngine := TsgcHTMX_Engine_Server_WebBrokerBridge.Create(Self);
FEngine.Router := FRouter;     // your htmx routes and the page
FEngine.Server := FServer;     // share the DataSnap port
FServer.Active := True;

// push a live HTML fragment to every connected browser
FEngine.BroadcastFragment(BuildStatsFragment);

引擎只认领它自己的路径、页面、资源和你的路由。其他一切都会原封不动地穿透而过,因此 /datasnap/* REST 以及你 TWebModule 上已有的动作仍然像以前一样正常工作,你所拥有的任何 OnCommandRequest 处理程序都会被链接起来并优先运行。同样的模式适用于全部三个桥接服务器:TsgcHTMX_Engine_Server_WebBrokerBridge 通过 HTTP/1.1 提供 Indy 桥接以及 HTTP/2 桥接,而 TsgcHTMX_Engine_Server_HTTPAPI_WebBrokerBridge 提供 HTTP.sys 桥接。

一个后端,两副面孔

在 DataSnap 上托管的一个很好的结果是,一套服务器方法可以身兼两职。你的 TDSServerModule 既是位于 /datasnap/rest 的、面向任何外部客户端的 REST 和 JSON API,同时也是你的 sgcHTML 页面在进程内渲染时所依据的数据源。你只需编写一次业务逻辑,就能从中获得机器 API 和人类 Web 界面两者,运行在一个服务器、一个端口上。

三个可供起步的示例

产品附带三个示例,它们以不同的风格构建同一个小型应用程序,因此你可以挑选最符合自己项目的那一个:

要求与可用性

WebBroker 引擎支持 Delphi 7 到 Delphi 13。DataSnap 桥接路径需要一个包含 DataSnap 的 Delphi 版本,即 Enterprise 或 Architect。WebBroker 和 DataSnap 是 Delphi 和 C++Builder 的框架,因此这套托管方案仅限于这两个编译器。sgcHTML 的 .NET 移植版本则托管在 ASP.NET Core 上,并在那里达到相同的效果。

这里描述的一切现在都已可用。完整的介绍、组件参考和代码示例都在 WebBroker & DataSnap 页面上。

对于将 sgcHTML 接入你的 DataSnap 服务器有疑问、反馈或需要帮助?联系我们。你将收到来自编写这些代码的人的回复。