はじめに
WebBroker は Delphi / C++Builder 等に含まれる Web サーバーアプリケーションを作るためのフレームワークです。
See also:
WebBroker
WebBroker を使って様々なタイプの Web サーバーアプリケーションを作る事ができます。
初出は Delphi 3 で、Delphi 5 からは Professional 版以上へ標準添付されるようになりました。
| バージョン | Standard | Professional | Client/Server |
|---|---|---|---|
| Delphi 3 | × | × | 〇 |
| Delphi 3.1 | × | 〇 | 〇 |
| Delphi 4 | × | △ (別売) | 〇 |
Delphi 13 Florence だと [ファイル | 新規作成 | その他] で [新規作成] ダイアログを開き、[Delphi プロジェクト > Web > Web サーバーアプリケーション] と辿って [Web サーバーアプリケーション] をクリックすると Web サーバーアプリケーションを作成するウィザードが開きます。
古い Delphi だと [新規作成] ダイアログの [新規作成] タブの中に [Web サーバーアプリケーション] があります。スクロールして探さないといけないかもしれません。
TWebModule
TWebModule は特殊なデータモジュールです。この Web モジュールに書かれたコードは各 Web サーバーアプリケーションで使い回すことができます。
コードは基本的に Web モジュールに集約する事になります。
既存のデータモジュールを TWebModule のように使いたい場合には、データモジュールに TWebDispatcher を追加します (TWebModule も TWebDispatcher も TCustomWebDispatcher からの派生です)。
See also:
- Web モジュール (DocWiki)
- Web.HTTPApp.TWebModule (DocWiki)
- Web ディスパッチャ (DocWiki)
- Web.HTTPApp.TWebDispatcher (DocWiki)
Web クライアントからのリクエストの処理
リクエストを処理するには [Web モジュール] を右クリックして [アクションの設定...] から [アクションの編集] ダイアログ (コレクションエディタ) を表示します。
ここに Http 要求メッセージに対する応答に対応するアクション項目 (TWebActionItem) を追加します。TWebActionItem に設定すべきプロパティは次の通りです:
| プロパティ | 説明 |
|---|---|
| Default | True に設定すると、他の Web アクションによって処理されないリクエストメッセージを処理する Web アクションにする事ができます。 |
| MethodType | Web アクションが処理するリクエストメッセージの種類 (HTTP メソッド) を指定します。 |
| Name | Web アクションの名前です。 |
| PathInfo | Web アクションが処理するリクエストメッセージの URIのパス部分を示します。 |
Web アクションの OnAction イベントハンドラで実際の応答を処理します。例えば、Default プロパティが True に設定された Web アクションで応答するイベントハンドラは次のようになります。
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
Response.StatusCode := 500;
Response.ContentType := 'application/json';
Response.Content :='''
{
"code" : 500,
"name" : "Bad Request"
}
''';
Response.SendResponse;
end;
Request パラメータにリクエストの情報が格納されており、
- Request.QueryFields
- Request.ContentFields
- Request.CookieFields
等でリクエストパラメータを取得する事ができます。
Response パラメータに応答するコンテンツを設定して、SendResponse() メソッドで送信します。明示的に SendResponse() を呼び出さなくとも、イベントハンドラを抜けた時にレスポンスが送信されていなければ自動で送信されるようです。
コンテンツはテキストの場合 Response.Content (string 型) へ、バイナリは Response.ContentStream (TStream 型) へ格納します。ContentStream に設定されたストリームは Response オブジェクトが破棄される際に自動で解放されるため、手動で解放する必要はありません。
Handled パラメータを False に設定すると、現在のイベントハンドラでリクエストを処理せずに他の (条件に一致する) Web アクションへ処理を回します。デフォルトで True が設定されています。
See also:
- HTTP (Wikipedia)
- Web.HTTPApp.TWebActionItem (DocWiki)
- Web.HTTPApp.TMethodType (DocWiki)
- Web.HTTPApp.THTTPMethodEvent (DocWiki)
- Web.HTTPApp.TWebRequest (DocWiki)
- Web.HTTPApp.TWebResponse (DocWiki)
コンテンツプロデューサー
コンテンツプロデューサーはコードとコンテンツを分離するのに使われます。コンテンツプロデューサーはレスポンスのコンテンツが HTML である場合に使われます。
procedure WebModule1.WebModule1DefaultHandlerAction(Sender: TObject; Request: TWebRequest;
Response: TWebResponse; var Handled: Boolean);
begin
PageProducer1.HTMLFile := 'index.html';
Response.Content := PageProducer1.Content;
end;
| プロデューサー | 説明 |
|---|---|
| TPageProducer | TDataSetPageProducer は、入力テンプレートを基に HTML コマンドの文字列を生成します。 |
| TQueryTableProducer | TQueryTableProducer は、クエリの結果セットを表形式で表示するための HTML コマンド シーケンスを作成します (BDE)。 |
| TSQLQueryTableProducer | TSQLQueryTableProducer は、クエリの結果セットを表形式で表示するための HTML コマンド シーケンスを作成します (DBX)。 |
| TDataSetTableProducer | TDataSetTableProducer は、データセット内のレコードを表形式で表示するための HTML コマンド シーケンスを作成します。 |
| TDataSetPageProducer | TDataSetPageProducer は、入力テンプレートを基に HTML コマンドの文字列を生成します。 |
TStringBuilder や TFile、正規表現や複数行文字列などがある現在では、コンテンツプロデューサーを利用するメリットは薄れてきているかもしれません。
procedure WebModule1.WebModule1DefaultHandlerAction(Sender: TObject; Request: TWebRequest;
Response: TWebResponse; var Handled: Boolean);
begin
Response.Content := TFile.ReadAllText('index.html');
end;
例えば HTML ファイルをコンテンツとして返すコードはこのように書けます。
See also:
- TPageProducer の使用 (DocWiki)
- TQueryTableProducer の使用 (DocWiki)
- TDataSetTableProducer の使用 (DocWiki)
- TDataSetPageProducer の使用 (DocWiki)
Web ファイルディスパッチャ
Web ファイルディスパッチャ TWebFileDispatcher は、静的なコンテンツのためのディスパッチャです。Web モジュールに貼り付けて使います。Delphi XE 以降で利用可能です。
| プロパティ | 説明 |
|---|---|
| DefaultFile | (仮想) フォルダそのものにアクセスされた時に見せるファイル (コンテンツ) のファイル名です |
| RootDirectory | ファイルの置かれている実フォルダです |
| VirtualPath | ファイルを見せる仮想フォルダです |
例えばプロパティが次のような値になっていた場合、
| プロパティ | 値 |
|---|---|
| DefaultFile | index.html |
| RootDirectory | .\files |
| VirtualPath | /files |
http://localhost/files/ にアクセスすると、<Web アプリケーションのパス>\files\ にある index.html が表示されます。
- 実フォルダにあるサブフォルダの表示/非表示は
WebDirectoriesプロパティで制御できます - ファイル拡張子と MIME タイプの関連付けは
WebFileExtensionsプロパティで制御できます -
BeforeDispatchイベントとAfterDispatchイベントを使って閲覧数を記録したり、ファイルに細工を施したりする事もできますが、同時アクセスの可能性を考慮する必要があります
Web モジュールの DefaultHandler を Enabled=False に設定してやれば、静的なコンテンツ (のみを) を扱う Web サーバーを簡単に作ることができます。
DefaultHandler でエラートラップしなくても、存在しないコンテンツを開こうとすると 404 Not Found が表示されます。
Web ステンシル (WebStencils)
Web ステンシル (WebStencils) は Delphi 12.2 Athens で追加された WebBroker 関連技術です。
| コンポーネント | 説明 |
|---|---|
| TWebStencilsProcessor | WebStencils 表記を埋め込んだ HTML ファイルを受け取り、@ タグを処理した後、それをプレーン HTML に変換します。 |
| TWebStencilsEngine | リクエスト URL を処理対象の HTML ファイルにマッピングするクラスです。 |
かなり高度な機能を持っていますので、リンク先の記事やドキュメントを読む事をオススメします。
TPageProducer の代替として利用可能です。
See also:
- WebStencils (DocWiki)
- Web.Stencils.TWebStencilsProcessor (DocWiki)
- Web.Stencils.TWebStencilsEngine (DocWiki)
- Delphi と HTMX で Web のパワーを活用する (Embarcadero Blog)
- RAD Studio の Web 開発を WebStencils テンプレートエンジンで刷新 (Embarcadero Blog)
- 「HTMX と WebStencils」RAD Studio で高速 Web 開発 (Embarcadero)
Web サーバーアプリケーションの種類
Delphi 13 Florence では、次に挙げるタイプの Web サーバーアプリケーションを作成する事が可能です。
- Apache ダイナミックリンクモジュール
- スタンドアロンコンソールアプリケーション
- スタンドアロン GUI アプリケーション
- ISAPI ダイナミックリンクライブラリ
- CGI スタンドアロン実行可能ファイル
- FastCGI スタンドアロン実行可能ファイル
以下、(廃止されたものも含めた) 作成可能な Web サーバーアプリケーションの概要です。
説明の都合上、順番が前後します。
See also:
■ スタンドアロンコンソール アプリケーション
対応プラットフォーム∶ Windows, Linux (x64) 1
単体のコンソールアプリケーションとして動作する Web サーバーアプリケーションです。
- Delphi XE 以降で作成可能 (XE では
Indy Web Serverと呼ばれていました) - 自身が Web サーバー兼 Web サーバーアプリケーションとなっています
- リクエストの度にスレッドが生成されます (スレッド毎に TWebModule が生成されます)
- 複雑な Web アプリケーションを作るのには向いてないかも...
■ スタンドアロン GUI アプリケーション
対応プラットフォーム∶ Windows, Android (ARM 32bit/64bit) 2, Linux (x64) 1
フォームのある GUI アプリケーションとして動作する Web サーバーアプリケーションです。
- Delphi XE 以降で作成可能 (XE では
Indy Web Serverと呼ばれていました) - 自身が Web サーバー兼 Web サーバーアプリケーションとなっています
- リクエストの度にスレッドが生成されます (スレッド毎に TWebModule が生成されます)
- 複雑な Web アプリケーションを作るのには向いてないかも...
- VCL で作る事も FireMonkey で作る事も可能です
- Android ベースの OS でも実行できます
- Linux 向けに作るには『FMX Linux』を別途インストールする必要があります (GetIt からインストールできます)
- アプリケーションに REST API サーバー機能を持たせる用途にも使えます 3
See also:
■ CGI スタンドアロン実行可能ファイル
対応プラットフォーム∶ Windows, Linux (x64) 1
CGI (Common Gateway Interface) として動作する Web サーバーアプリケーションです。
- 『Kylix』で作る事もできます (Linux x86)
- CGI として動作させるためには、別途何らかの Web サーバーのインストールが必要です
- Web サーバーと CGI プログラムは標準入力と標準出力 (と環境変数) を使ってデータをやりとりします
- リクエストの度にインスタンス (プロセス) が生成されます (サーバーのリソースを食いがち)
- WebBroker を使わずに CGI アプリケーションを書く事も可能です
See also:
■ FastCGI スタンドアロン実行可能ファイル
対応プラットフォーム∶ Windows, Linux (x64) 1
FastCGI として動作する Web サーバーアプリケーションです。
- Delphi 13 Florence 以降で作成可能
- 別途 nginx や Apache HTTP Server のインストールが必要です
- リクエストの度にスレッドが生成されます (スレッド毎に TWebModule が生成されます)
See also:
■ Apache ダイナミックリンクモジュール
対応プラットフォーム∶ Windows, Linux (x64) 1
『Apache HTTP Server』で動作する Web サーバーモジュールです。
- Delphi 6 以降で作成可能
- 『Kylix』で作る事もできます (Linux x86)
- 別途 Apache HTTP Server のインストールが必要です
- リクエストの度にスレッドが生成されます (スレッド毎に TWebModule が生成されます)
See also:
- Apache HTTP Server Project
- Apache HTTP Server (Wikipedia)
- 【Delphi】WebBroker のための Apache HTTP Server 導入 (Windows) (Qiita)
■ ISAPI ダイナミックリンクライブラリ
対応プラットフォーム∶ Windows
『Internet Information Services (IIS)』や『Personal Web Server (PWS)』 で動作する Web サーバーモジュールです。
- 別途 IIS のインストールが必要です
- ISAPI (Internet Server Application Programming Interface) とは IIS 用の API の事です
- リクエストの度にスレッドが生成されます (スレッド毎に TWebModule が生成されます)
- Windows 向け Apache には ISAPI 用 DLL を利用可能にするための
mod_isapiモジュールが用意されています (Apache で IIS 用の DLL モジュールが使えます) - Delphi 3.x では ISAPI 用モジュールをビルドしても IsMultiThread グローバル変数が True に設定されません
See also:
- Internet Information Services (Wikipedia)
- ISAPI (Wikipedia)
- System.IsMultiThread (DocWiki)
- 【Delphi】WebBroker のための Internet Information Services (IIS) 導入 (Qiita)
■ NSAPI ダイナミックリンクライブラリ (廃止)
対応プラットフォーム∶ Windows
Windows 向け『Netscape Enterprise Server』や『Netscape Fast Track Server』で動作する Web サーバーモジュールです。
- Delphi 2010 以前で作成可能です
- ISAPI 用 DLL を動作させるための
IsapiTer.dll(とそのソースコード) が含まれていました - 古いバージョンに『NSAPI (Netscape Server API)』対応とあるのは、単に ISAPI <-> NSAPI 変換モジュールが使えるという意味です
See also:
■ Win-CGI スタンドアロン実行可能ファイル (廃止)
対応プラットフォーム∶ Windows
WinCGI として動作する Web サーバーアプリケーションです。
- Delphi 6 以前で作成可能です
- WinCGI として動作させるためには、別途何らかの WinCGI 対応 Web サーバー (『O'Reilly & Associates WebSite』等) のインストールが必要です
- Web サーバーと CGI プログラムはファイルを使ってデータをやりとりします
- WinCGI は環境変数にアクセスできなかった『(古い) Visual Basic』で CGI を書く用途で考えられたようです
- WebBroker を使わずに WinCGI アプリケーションを書く事も可能です
See also:
■ Web アプリケーションデバッガ用実行形式 (廃止)
Web アプリケーションのデバッグを行うための実行形式ファイルです。
- Delphi 6~XE で作成可能です
XE 以降ではスタンドアロンアプリケーションを作成してデバッグできます。
Web アプリケーションデバッガの使い方
- Web サーバーアプリケーションを作成するウィザードで
[Web アプリケーションデバッガ用実行形式]を選択します - Web モジュールにロジックを記述します
- 実行します
- IDE の [ツール | Web アプリケーションデバッガ] で
Borland (/ CodeGear / Embarcadero) Web App Debuggerを開きます -
[起動]ボタンを押すと、デフォルト URL:にあるテキストがリンクに変化するので、それをクリックしてブラウザを起動します

- ブラウザで次のような画面が開くので、実行されているアプリケーションを選択し、
[実行]ボタンを押すとデバッグ実行する事ができます
Web App Debugger は簡易的な Web サーバーで、それを介してロジックをデバッグする感じです。応答時間を計測する事もできます。
Professional 版だと [Web アプリケーションデバッガ] が [ツール] メニューにないかもしれません。そのような時は、<インストールフォルダ>\bin にある webappdbg.exe を [ツール | ツールの構成] (または [ツール | ツールの設定])で登録してください。
なお、Delphi 2005 はウィザードで [Web アプリケーションデバッガ用実行形式] を選択できるのに webappdbg.exe が存在しません (Professional 版だけ?)。
[Web アプリケーションデバッガ] が正しく動作しないようであれば、<インストールフォルダ>\bin にある ServerInfo.exe を一度管理者権限で実行してみてください。
おわりに
昨今の WebBroker 事情についてでした。WebBroker に関する情報が載った書籍はそれなりにあるのですが、多くは Delphi 6 以前に書かれたものです。
それでも、基本的な考え方は同じなので、取っ掛かりのために書籍を購入してみるのもいいかもしれませんね。
See also:
- 『カラオケの鉄人』店舗で、クーポン作成 - DTP並みの印刷システム実現の手法 (第31回デベロッパーキャンプ T4 資料)
- FastCGI for Delphi (Github: @kylixfans)
- DelphiMVCFramework (Github: @danieleteti)
関連書籍
| タイトル | 著者 | ISBN-10 (Amazon) |
出版年 |
|---|---|---|---|
| Delphi 6 プログラミングバイブル | Marco Cantu (著) 篠原 慶 (訳) 光田 秀 (訳) |
4844316346 | 2002/4 |
| Delphi DB & Web プログラミング | 松浦 健一郎 (著) 司 ゆき (著) |
4797318600 | 2001/12 |
| Windows プログラマの LINUX 読本 ― Kylix と Linux を始める |
米沢 千賀子 | 4797820233 | 2001/11 |
| Delphi 5 実践データベースプログラミング ― DB コンポーネントと QuickReport の活用 |
田中 和明 | 4877830251 | 2000/06 |
| データベース Linux Java Servlet による Web サーバー構築編 |
加藤 大受(著) 田原 孝(著) Inprise (監) |
4756133797 | 2000/3 |
| Delphi 5 で作る Web アプリケーション入門 | 西村 めぐみ | 4877780270 | 2000/2 |
| Delphi プログラマのための CGI 入門 ― WebBroker でらくらくプログラミング |
山本 秀樹 | 478983591X | 1999/8 |
| Delphi で作る高速 CGI | 田原 孝 | 4871936600 | 1998/12 |









