この講義からCGIプログラミングの学習に入ります。これまでの講義で、CGI プログラミングの基礎知識を習得しました。これで、座って CGI プログラムを作成できるようになりました。
3. CGIプログラミング
1. サーバー側アタッチメント (SSI) とゲートウェイ
2. ゲートウェイ: WEB 経由で他のプロトコルに接続します。
CGI プログラムを作成するプロセスでは、次のアプリケーション設計のポイントに従うのが最善です。
(1) 質問する – 解決したい問題
(2) 設計段階 - CGIプログラムの基本的な枠組みと機能を考える
(3) コーディング段階 - アイデアを行動で実現する
(4) プログラムの移植 -- 移植可能なコードを作成する
(5) 卓越性の追求 - プログラムをより高いレベルに引き上げる
1. サーバー側アタッチメント (SSI) とゲートウェイ
このセクションでは、サーバー側アタッチメント SSI (Server Side Include) とゲートウェイについて紹介します。厳密に言えば、SSI は CGI プログラミングの一部ではありませんが、単純な CGI プログラムが実行できるいくつかのタスクを SSI で実行でき、場合によっては SSI が最良の選択になることもあります。したがって、ここでは簡単に紹介します。
SSI は、HTML テキストに埋め込まれた一連のコマンドを定義します。HTML テキストが HTTP クライアントに送信される前に、WEB サーバーはこれらの SSI コマンドを前処理し、処理された HTML テキストを HTTP クライアントのブラウザに出力します。
SSI のコマンド形式は次のとおりです。
< !--# コマンドパラメータ="値" -->
SSI コマンドは、クライアント側ではなくサーバー側で処理されるという点で Java や JavaScript とは異なります。これは CGI プログラムに似ています。もちろん、SSI の機能範囲内では、その利点は CGI プログラムの利点と同じであり、サーバーのリソース使用率を向上させることができ、クライアント上のどの WEB ブラウザでも SSI を含む HTML テキストを閲覧できます。
一般的に使用される 6 つの SSI コマンドは次のとおりです。
(1)インクルードコマンド
(2) echoコマンド
(3) 実行コマンド
(4)configコマンド
(5) fsizeコマンド
(6) flashmodコマンド
コマンドを含める
サポートされている唯一のパラメータは file です。これは、file パラメータで指定されたファイルの内容を現在の HTML テキストに挿入します。 C言語をご存知の方であれば、C言語の「#include」コマンドと同じ機能であることがわかると思います。たとえば、main.html と header.html という 2 つの HTML テキストがあります。main.html: main.html で include コマンドを使用します。
<html>
<tilte> SSI コマンドを含めるテスト </ /title>
< !--#include file="header.html" -->
<本文>
上記のヘッダーは header.html から取得したものです。
< /body>
< /html>
ヘッダー.html:
< H1> これは header.html のタイトルです。 < /H1>
(ただし、OmniHTTPD は include コマンドをサポートしていないようです:< !)
エコーコマンド
サポートされている唯一のパラメータは var で、これはサーバー提供の変数を表示するために使用されます。次に例を示します。
DOCUMENT_NAME: 現在のファイル名
DOCUMENT_URL: SSI テキストへの相対パス
DATE_LOCAL: 現地の日付
DATE_GMT: GMT (クリーニッチ標準時) の日付
LAST_MODIFIED: この SSI コマンドを含むファイルの最終変更日
HTTP_USER_AGENT: ブラウザ名。
例: main.shtml <html>
このドキュメントの最終更新日は < !--#echo var="LAST_MODIFIED"--> です。
< /html>
main.shtml をブラウザで開くと、最終更新時刻が表示されます。 (main.shtml は OmniHTTPD の HtDocs ディレクトリに保存し、アドレス http://localhost/main.shtml を使用してブラウザでアクセスする必要があることに注意してください。)
実行コマンド
2 つのパラメータは cgi と cmd です。前者は、cgi="/cgi-bin/finger.cgi" などの実行可能ファイルを呼び出します。後者は、cmd="ls" などのシステム コマンドを呼び出します。残念ながら、OmniHTTPD はこの SSI コマンドをサポートしていません (おそらく最新バージョンはサポートしていると思われます)。
設定コマンド
このコマンドは、サーバーがファイルを処理し、日付を表示する方法を設定します。これには 2 つのパラメータがあります。
(1) timefmt は、日付の表示形式を決定します。 UNIX では man strftime を使用して、使用可能な値をクエリします。
(2) sizefmt は、ファイルの長さを表示する形式を決定します。値はバイトまたはアドレスです。このコマンドは OmniHTTPD でもサポートされていません。
fsize コマンド
このコマンドは、指定されたファイルのサイズを表示します。パラメータは file で、ファイルのパスとファイル名を指定します。
flashmodコマンド
このコマンドは、指定されたファイルの最終変更日を表示します。パラメータは file で、ファイルのパスとファイル名を指定します。
2. ゲートウェイ: WEB 経由で他のプロトコルに接続します。
HTTP プロトコルでは、インターネット上のすべてのリソースにアクセスできるわけではありません。HTTP プロトコル以外のリソース (電子メールを送受信するための POP3 や SMTP など) にアクセスしたい場合は、ゲートウェイが必要です。 CGI プログラムはゲートウェイを実装する良い方法です。
一般的に使用されるゲートウェイのいくつかは、finger、wais、archie など、多くの UNIX HTTP サーバーで提供されています。しかし、OmniHTTPD では、これらのゲートウェイは提供されません。ただし、CGI プログラムを作成することで、OmniHTTPD にゲートウェイ機能を追加できます。
フォームとその処理
HTML フォームは WEB ドキュメントの一部であり、ユーザーが入力した情報をサーバーに送信するために使用されます。 通常、これらの情報は CGI プログラムに渡され、CGI プログラムは入力情報に基づいて一連の操作やデータ処理を実行し、処理結果を表す HTML 文書を生成してクライアントのブラウザに送り返します。
CGI プログラムの重要な部分は入力データを取得して HTML ドキュメントを生成することであり、操作部分とデータ処理部分はほとんどのアプリケーションと同じであることがわかります。 この講座では、PerlとDelphiでデータを取得してHTML文書を出力する方法を紹介します。
まず、greeting.html という名前の HTML ドキュメントを作成します。
greeting.html ファイル (OmniHTTPD の HtDocs ディレクトリに保存されます)
<html>
<頭>
<title>これは挨拶ページです </title>
< h1> ご挨拶 </ /h1>
<本文>
<時間>
< フォームアクション="/cgi-bin/greeting.pl" メソッド=POST>
< p> あなたの名: < input type=text name="firstname" size=60 maxlength=80> < /p>
< p> あなたの姓: < input type=text name="lastname" size=60 maxlength=80> < /p>
<時間>
< p> < input type=submit value="すべて OK!"> < input type=reset value="すべてクリア"> </ /p>
< /form>
< /body>
< /html>
Perl CGI プログラムgreeting.plは次のとおりです。
greeting.pl ファイル (OmniHTTPD の cgi-bin ディレクトリに保存されています) # こんにちは!
「cgi-lib.pl」が必要です。
# ==================================
# 入力値を取得する
&ReadParse(*入力);
$mFirstName = $input{'firstname'};
$mLastName = $input{'姓'};
# ==================================
# ここでいくつかの操作を実行します
$mFullName = "$m名 $m姓";
# ==================================
# 出力するHTML文書を作成
PRint&PrintHeader;
print "< html>< head>< title> はじめまして! </ /title>< /head> ";
print "< body> こんにちは、< i>$mFullName</ i> ! ";
print "< hr> by Greeting.pl < /body>< /html>";
# ==================================
#すべて完了しました!
http://localhost/greeting.html を参照して CGI プログラムをテストします。
上記の Perl プログラムでは、CGI プログラムとして、require "cgi-lib.pl" を使用して cgi-lib.pl ファイルを参照する必要があります。このファイルには CGI プログラミングのための多くの関数とプロシージャが含まれています。 require は C の #include に相当しますが、require ステートメントの後にセミコロンが必要であることに注意してください。
ReadParse プロセスは、HTML フォームによって送信されたデータを読み取ります。パラメーターは配列ポインターです。 Perl では、関数とプロシージャの呼び出しの前に & 記号を付ける必要があることに注意してください。
mFirstName、mLastName、および mFullName は変数です。 Perl では、変数名の前に $ 記号を付ける必要があります。
PrintHeader 関数の実際の戻り値は「Content-type: text/html」で、これはブラウザに次のデータが HTML ドキュメントであることを伝えます。
HTML ドキュメントの生成は非常に簡単で、print ステートメントを使用して HTML ドキュメントのコンテンツを出力するだけです。 Perl を使って CGI プログラムを書くことはできますか?
次に、同じ機能を実行する Delphi プログラムを作成してみましょう。
まず、Delphi ですべてのプロジェクトを閉じ、メニューから [ファイル]、[新規] を選択し、ダイアログ ボックスで Web サーバー アプリケーションの種類を選択し、[CGI スタンドアロン実行可能ファイル] オプションを使用します。メイン ウィンドウ名が WebModule1 の新しいプロジェクトが表示されます。
WebModule1 の Actions プロパティをマウスでダブルクリックすると、Actions プロパティ編集ウィンドウが表示されます。 ウィンドウに WebActionItem1 という名前の新しいアクションを作成し、その Default プロパティを True に設定し、そのイベント内の OnAction イベントをダブルクリックして、次のコードを追加します。
プロシージャ TWebModule1.WebModule1WebActionItem1Action(送信者: TObject;リクエスト: TWebRequest; 応答: TWebResponse; 処理される変数: Boolean);
変数
mFirstName、mLastName、mFullName: 文字列;
HTMLDoc: 文字列;
始める
// 入力値を取得します:
mFirstName := Request.ContentFields.Values['firstname'];
mLastName := Request.ContentFields.Values['lastname'];
// ここでいくつかの操作を行います
mFullName := mFirstName + ' ' + mLastName;
// 出力するHTML文書を作成する
HtmlDoc := '< html>< head>< title> はじめまして </ /title>< /head>';
HtmlDoc := HtmlDoc + '< body> こんにちは、< i>' + mFullName + '</ /i> !';
HtmlDoc := HtmlDoc + '< hr> by Greeting.cgi < /body>< /html>';
Response.Content := HtmlDoc;
終わり;
このプロジェクトのユニットを cgimain.pas として保存し、プロジェクトをgreeting.dpr として保存します。 コンパイル後 (Ctrl+F9 を使用)、greeting.exe を OmniHTTPD の cgi-bin ディレクトリにコピーし、名前をgreeting.cgi に変更します。 同時に、前に作成したgreeting.htmlに次の変更を加えます。
< form action="/cgi-bin/greeting.pl" method=POST> を次のように変更します。
< フォームアクション="/cgi-bin/greeting.cgi" メソッド=POST>
このようにして、http://localhost/greeting.html を参照して、Delphi で作成された CGI プログラムをテストできます。
このプログラムからわかるように、Delphi では、CGI プログラムがリクエストを受け取るとすぐに、WebActionItem の OnAction イベントが発生します。 このイベントでは、データの入力と HTML ドキュメントの生成は次のように行われます。
Request.ContentFields.Values[HTML フォーム要素名] を通じてフォーム要素の値を取得します。
Response.Content に値を代入して HTML ドキュメントを生成します。
以下は、Delphi プログラムの 3 つのファイルの内容です。 ------------------------------------ ---- -------------------
挨拶.dpr :
番組挨拶。
{$APPTYPE コンソール}
用途
HTTPアプリ、
CGIアプリ、
「cgimain.pas」の cgimain {WebModule1: TWebModule};
{$E CGI}
{$R *.RES}
始める
アプリケーションの初期化;
Application.CreateForm(TWebModule1, WebModule1);
アプリケーション.実行;
終わり。
-------------------------------------------------- ----------
cgimain.pas:
ユニット cgimain;
インタフェース
Windows、メッセージ、SysUtils、クラス、HTTPApp を使用します。
タイプ
TWebModule1 = クラス(TWebModule)
プロシージャ WebModule1WebActionItem1Action(送信者: TObject;リクエスト: TWebRequest; 応答: TWebResponse; 処理される変数: Boolean);
プライベート
{プライベート宣言}
公共
{公的宣言}
終わり;
変数
Webモジュール1: TWebモジュール1;
実装
{$R *.DFM}
プロシージャ TWebModule1.WebModule1WebActionItem1Action(送信者: TObject; リクエスト: TWebRequest; 応答: TWebResponse; 処理される変数: Boolean);
変数
mFirstName、mLastName、mFullName: 文字列;
HTMLDoc: 文字列;
始める
// 入力値を取得します:
mFirstName := Request.ContentFields.Values['firstname'];
mLastName := Request.ContentFields.Values['姓'];
// ここでいくつかの操作を行います
mFullName := mFirstName + ' ' + mLastName;
// 出力するHTML文書を作成する
HtmlDoc := '< html>< head>< title> はじめまして </ /title>< /head>';
HtmlDoc := HtmlDoc + '< body> こんにちは、< i>' + mFullName + '</ /i> !';
HtmlDoc := HtmlDoc + '< hr> by Greeting.cgi < /body>< /html>';
Response.Content := HtmlDoc;
終わり;
終わり。
-------------------------------------------------- ----------
cgimain.dfm:
オブジェクト WebModule1: TWebModule1
OldCreateOrder = False
アクション = <
アイテム
デフォルト = True
名前 = 'WebActionItem1'
OnAction = WebModule1WebActionItem1Action
終わり>
左 = 192
トップ = 107
高さ = 150
幅 = 215
終わり