WebBroker と DataSnap 上の sgcHTML | sgcHTML | eSeGeCe

WebBroker と DataSnap 上の sgcHTML

sgcHTML は sgcWebSockets サーバーに縛られていません。そのコンポーネントレイヤーとノードレイヤーは、あらゆるトランスポートから独立したプレーンな HTML 文字列を生成するため、sgcWebSockets HTTP サーバー向けに構築したのと同じページを、Embarcadero WebBroker アプリケーションや DataSnap サーバーから配信できます。エンジンコンポーネントを 1 つ Web モジュールに配置するか、ブリッジサーバーに割り当てれば、DataSnap REST API と sgcHTML の Web UI が 1 つのポート上で並んで動作します。

標準の IWebDispatch
1 ポートで 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 ブリッジサーバーから配信できます。1 つのコードベースで、複数のデプロイ形態に対応します。

アプリに合ったホストを選ぶ

sgcWebSockets サーバーの外で sgcHTML を配信する方法は 2 つあります。プレーンな WebBroker は、CGI から ISAPI まで最も幅広い到達範囲を提供します。ブリッジサーバー経路は、ライブな WebSocket プッシュを追加し、DataSnap とポートを共有します。

1. あらゆる WebBroker アプリケーション

TsgcHTMX_Engine_Server_WebBroker は標準の IWebDispatch を実装します。Web モジュールをオーナーとして TWebModule に配置するか、アクションリストを先に実行したい場合は TWebActionItem からその DispatchRequest を呼び出します。どちらの方法でも、sgcHTML のページ、組み込みの CSS と JavaScript のアセット、そして Router に登録した HTMX の HTTP ルートを配信します。スタンドアロンの TIdHTTPWebBrokerBridge、ISAPI モジュール、Apache モジュール、そして CGI 上で動作します。

ここでのインタラクティブ性は、プレーンな HTTP の往復による標準の HTMX なので、WebSocket は不要です。マークアップだけが欲しいホストやページ向けに、HTMX をまったく使わず、フルページのナビゲーションと標準のフォーム送信による、従来型のプレーン HTML モードもサポートされています。計画しておくべき注意点が 1 つあります。プレーンな WebBroker、CGI、ISAPI では、リクエストとレスポンスのライフサイクルがソケットを占有するため、WebSocket プッシュはありません。この経路でライブ更新が必要な場合は、HTMX のポーリングを使うか、下記のブリッジサーバーに移行してください。

2. DataSnap とブリッジサーバー、リアルタイム対応

TsgcHTMX_Engine_Server_WebBrokerBridge は、sgcWebSockets の WebBroker ブリッジサーバー、すなわち HTTP/1.1 上の TsgcWSHTTPWebBrokerBridgeServer と HTTP/2 上の TsgcWSHTTP2WebBrokerBridgeServer を対象とします。TsgcHTMX_Engine_Server_HTTPAPI_WebBrokerBridge は、HTTP.sys 上の TsgcWSServer_HTTPAPI_WebBrokerBridge を対象とします。エンジンの Server プロパティをブリッジサーバーに割り当てると、sgcHTML のページ、そのアセット、そして BroadcastFragment を通じたライブな WebSocket フラグメントのプッシュが、すべて DataSnap REST エンドポイントと同じポート上で動作します。

エンジンは自分自身のパスだけを要求するため、/datasnap/* の REST 呼び出しや既存の TWebModule アクションは、これまでとまったく同じように動作し続けます。すでに割り当て済みの OnCommandRequest ハンドラーはチェーンされ、あなたのハンドラーが先に実行されるため、あなたが構築したものが乗っ取られることはありません。

DataSnap のメソッドが API とページデータの両方になる

同じ DataSnap サーバーメソッドが、2 つの利用者に同時に応えられます。TDSServerModule は、外部クライアント向けに /datasnap/rest/... で提供される REST / JSON API であると同時に、同じサーバー上でプロセス内から sgcHTML のページがレンダリングに使うデータソースでもあります。ビジネスロジックを一度書けば、ブラウザのフラグメントからも、外部の REST 呼び出し元からも、1 つの共有クラスを通じてアクセスできます。

REST / JSON API

外部クライアントは、標準の DataSnap WebBroker サーバーが公開するのとまったく同じように、/datasnap/rest/TServerMethods/<Method>/... でサーバーメソッドを呼び出します。sgcHTML エンジンはこれらのパスに手を触れません。

サーバーでレンダリングされるページデータ

ルートハンドラーやアクションハンドラーは、まさに同じサーバーメソッドクラスをプロセス内で呼び出し、結果を読み取って sgcHTML のコンポーネントに渡します。ページは、REST API に応答するのと同一のバックエンドからレンダリングされます。

ライブプッシュ、同じポート

ブリッジサーバー経路では、BroadcastFragment が、DataSnap エンドポイントと同じポート・同じプロセス上で、接続中のすべてのブラウザーに WebSocket 経由で新しい HTML をプッシュします。ダッシュボードやモニターは、データが変化した瞬間に更新されます。

エンジンをホストに接続する

エンジンを作成し、ルーターとページを与え、DataSnap とリアルタイムの経路ではブリッジサーバーに割り当て、プレーンな WebBroker 経路では Web モジュールに配置します。

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

製品には 3 つのデモが同梱

上記の各経路は、sgcWebSockets ディストリビューションに含まれる、完全に動作するデモです。すでにビルドしてディスパッチできるプロジェクトから始められます。

WebBroker + DataSnap、HTMX

Demos\60.HTML\11.WebBroker は、DataSnap バックエンドと完全な HTMX インタラクティブ性を備えた、WebBroker 上のミニ CRM です。エンジン、DataSnap REST、標準の WebModule アクションが 1 つの Web モジュールを共有する様子を示します。

従来型のプレーン HTML、HTMX なし

Demos\60.HTML\12.WebBrokerHTML は、同じ種類のページを従来型のプレーン HTML モードで配信します。DataSnap バックエンド上でフルページのナビゲーションと標準のフォーム送信を行い、HTMX はまったく使いません。

1 ポートで動くリアルタイムダッシュボード

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 UI を追加

すでに運用している WebBroker アプリケーションや DataSnap サーバーから、sgcHTML の他の場所でも使うのと同じコンポーネント API で、リアルタイムな Bootstrap 5 のページを配信できます。