WebBroker 및 DataSnap에서 sgcHTML | sgcHTML | eSeGeCe

WebBroker 및 DataSnap의 sgcHTML

sgcHTML은 sgcWebSockets 서버에 종속되지 않습니다. 컴포넌트 계층과 노드 계층은 어떤 전송 방식과도 독립적인 순수 HTML 문자열을 생성하므로, sgcWebSockets HTTP 서버용으로 구축한 동일한 페이지를 Embarcadero WebBroker 애플리케이션과 DataSnap 서버에서 그대로 제공할 수 있습니다. 엔진 컴포넌트 하나를 웹 모듈에 배치하거나 브리지 서버에 할당하면, DataSnap REST API와 sgcHTML 웹 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에 배치하거나, 액션 목록을 먼저 실행하고 싶을 때는 TWebActionItem에서 DispatchRequest를 호출하십시오. 두 방식 모두 sgcHTML 페이지, 내장 CSS 및 JavaScript 자산, 그리고 Router에 등록한 HTMX HTTP 경로를 제공합니다. 독립 실행형 TIdHTTPWebBrokerBridge, ISAPI 모듈, Apache 모듈 및 CGI에서 실행됩니다.

여기서의 인터랙티브 기능은 순수 HTTP 왕복을 통한 표준 HTMX이므로 WebSocket이 필요 없습니다. HTMX를 전혀 사용하지 않고 전체 페이지 내비게이션과 표준 폼 전송을 사용하는 클래식 순수 HTML 모드도 지원되므로, 마크업 외에는 아무것도 원하지 않는 호스트와 페이지에 적합합니다. 한 가지 유의할 점: 순수 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 서버 메서드가 두 대상을 동시에 서비스할 수 있습니다. TDSServerModule은 외부 클라이언트를 위한 /datasnap/rest/...의 REST 및 JSON API인 동시에, sgcHTML 페이지가 동일한 서버에서 인프로세스로 렌더링하는 데이터 소스이기도 합니다. 비즈니스 로직을 한 번만 작성한 다음, 브라우저 조각과 외부 REST 호출자 양쪽에서 하나의 공유 클래스를 통해 접근합니다.

REST / JSON API

외부 클라이언트는 표준 DataSnap WebBroker 서버가 노출하는 것과 정확히 동일하게 /datasnap/rest/TServerMethods/<Method>/...에서 서버 메서드를 호출합니다. sgcHTML 엔진은 이러한 경로를 건드리지 않습니다.

서버 렌더링 페이지 데이터

사용자의 경로 및 액션 핸들러는 완전히 동일한 서버 메서드 클래스를 인프로세스로 호출하고, 결과를 읽어 sgcHTML 컴포넌트에 전달합니다. 페이지는 REST API에 응답하는 것과 동일한 백엔드에서 렌더링됩니다.

실시간 푸시, 동일한 포트

브리지 서버 경로에서는 BroadcastFragment가 DataSnap 엔드포인트와 동일한 포트 및 프로세스에서 WebSocket을 통해 연결된 모든 브라우저에 새 HTML을 푸시합니다. 대시보드와 모니터는 데이터가 변경되는 즉시 업데이트됩니다.

엔진을 호스트에 연결하십시오

엔진을 생성하고, 라우터와 페이지를 지정한 다음, DataSnap 및 실시간 경로를 위해서는 브리지 서버에 할당하거나, 순수 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는 DataSnap 백엔드와 완전한 HTMX 인터랙티브 기능을 갖춘 WebBroker 기반의 미니 CRM으로, 엔진, DataSnap REST 및 표준 WebModule 액션이 하나의 웹 모듈을 공유하는 모습을 보여줍니다.

클래식 순수 HTML, HTMX 없음

Demos\60.HTML\12.WebBrokerHTML은 DataSnap 백엔드 위에서 전체 페이지 내비게이션과 표준 폼 전송을 사용하며 HTMX를 전혀 사용하지 않는 클래식 순수 HTML 모드로 동일한 종류의 페이지를 제공합니다.

하나의 포트에서 실시간 대시보드

Demos\40.DataSnap\Server_Indy_HTTP_HTML은 단일 포트에서 DataSnap과 함께 실시간 sgcHTML 대시보드를 실행하며, 통계, 차트 및 로그 조각을 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-Access모든 eSeGeCe 제품과 프리미엄 지원이 포함되어 연 €1,059부터 이용할 수 있어요.
All-Access 가격 보기

WebBroker 또는 DataSnap 서버에 웹 UI를 추가하십시오

이미 운영 중인 WebBroker 애플리케이션이나 DataSnap 서버에서, sgcHTML의 다른 모든 곳에서 사용하는 동일한 컴포넌트 API로 실시간 Bootstrap 5 페이지를 제공하십시오.