C++ Web プログラミング
CGI とは?
- <リ>
Common Gateway Interface (CGI) は、Web サーバーとカスタム スクリプトの間で情報を交換する方法を定義する一連の標準です。
<リ>CGI仕様は現在NCSAによって維持されており、NCSAはCGIを次のように定義しています-
<リ>Common Gateway Interface (CGI) は、外部ゲートウェイ プログラムが HTTP サーバーなどの情報サーバーとやり取りするための標準です。
<リ>現在のバージョンは CGI/1.1 で、CGI/1.2 は進行中です。
ウェブ閲覧
CGI の概念を理解するために、ハイパーリンクをクリックして特定の Web ページまたは URL を閲覧するとどうなるか見てみましょう。
- <リ>
ブラウザは HTTP Web サーバーに接続し、URL を要求します。ファイル名.
<リ>Web サーバーは URL を解析し、ファイル名を探します。要求されたファイルが見つかった場合、Web サーバーはそのファイルをブラウザに送り返します。それ以外の場合は、間違ったファイルを要求したことを示すエラー メッセージが送信されます。
<リ>Web ブラウザは Web サーバーから応答を取得し、受信した応答に基づいて、受信したファイルまたはエラー メッセージを表示します。
ただし、特定のディレクトリ内のファイルが要求されるたびに、そのファイルが返されないように HTTP サーバーを設定することは可能です。代わりに、プログラムとして実行され、プログラムから生成された出力がブラウザに返されて表示されます。
Common Gateway Interface (CGI) は、アプリケーション (CGI プログラムまたは CGI スクリプトと呼ばれる) が Web サーバーおよびクライアントと対話できるようにするための標準プロトコルです。これらの CGI プログラムは、Python、PERL、シェル、C、C++ などで作成できます。
CGI アーキテクチャ図
次の簡単なプログラムは、CGI の簡単なアーキテクチャを示しています −
ウェブ サーバーの構成
CGI プログラミングに進む前に、Web サーバーが CGI をサポートし、CGI プログラムを処理するように構成されていることを確認してください。 HTTP サーバーによって実行されるすべての CGI プログラムは、事前に構成されたディレクトリに保持されます。このディレクトリは CGI ディレクトリと呼ばれ、慣例により /var/www/cgi-bin と命名されます。慣例により、CGI ファイルの拡張子は .cgi になります。 ただし、C++ 実行可能ファイルです。
デフォルトでは、Apache Web サーバーは /var/www/cgi-bin で CGI プログラムを実行するように構成されています。 CGIスクリプトを実行するために他のディレクトリを指定したい場合は、httpd.confファイルの次のセクションを変更できます-
<Directory "/var/www/cgi-bin"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> <Directory "/var/www/cgi-bin"> Options All </Directory>
ここでは、Web サーバーが正常に稼働しており、Perl や Shell などの他の CGI プログラムを実行できると想定しています。
最初の CGI プログラム
次の C++ プログラムの内容を検討してください −
#include <iostream> using namespace std; int main () { cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Hello World - First CGI Program</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<h2>Hello World! This is my first CGI program</h2>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }
上記のコードをコンパイルし、実行可能ファイルに cplusplus.cgi という名前を付けます。このファイルは /var/www/cgi-bin ディレクトリに保管されており、以下の内容を持っています。 CGI プログラムを実行する前に、chmod 755 cplusplus.cgi を使用してファイルのモードが変更されていることを確認してください。 ファイルを実行可能にする UNIX コマンド
初めての CGI プログラム
上記の C++ プログラムは、その出力を STDOUT ファイル、つまり画面に書き込む単純なプログラムです。最初の行の印刷 Content-type:text/html\r\n\r\n という重要な追加機能が 1 つあります。 .この行はブラウザーに送り返され、ブラウザー画面に表示されるコンテンツ タイプを指定します。これで、CGI の基本概念が理解できたはずで、Python を使用して多くの複雑な CGI プログラムを作成できるようになりました。 C++ CGI プログラムは、RDBMS などの他の外部システムとやり取りして、情報を交換できます。
HTTP ヘッダー
行 Content-type:text/html\r\n\r\n コンテンツを理解するためにブラウザーに送信される HTTP ヘッダーの一部です。すべての HTTP ヘッダーは次の形式になります −
HTTP Field Name: Field Content For Example Content-type: text/html\r\n\r\n
CGI プログラミングで頻繁に使用する重要な HTTP ヘッダーは他にほとんどありません。
Sr.No | ヘッダーと説明 |
---|---|
1 | コンテンツ タイプ: 返されるファイルの形式を定義する MIME 文字列。例は Content-type:text/html です。 |
2 | 有効期限:日付 情報が無効になる日付。これは、ブラウザがいつページを更新する必要があるかを判断するために使用する必要があります。有効な日付文字列は、1998 年 1 月 1 日 12:00:00 GMT の形式である必要があります。 |
3 | 場所:URL 要求された URL の代わりに返される URL。このフィールドを使用して、要求を任意のファイルにリダイレクトできます。 |
4 | 最終更新日:日付 リソースの最終変更日。 |
5 | 内容の長さ:N 返されるデータの長さ (バイト単位)。ブラウザはこの値を使用して、ファイルの推定ダウンロード時間を報告します。 |
6 | セット Cookie:文字列 string を介して渡された Cookie を設定します . |
CGI 環境変数
すべての CGI プログラムは、次の環境変数にアクセスできます。これらの変数は、CGI プログラムを作成する際に重要な役割を果たします。
Sr.No | 変数名と説明 |
---|---|
1 | CONTENT_TYPE クライアントが添付コンテンツをサーバーに送信するときに使用される、コンテンツのデータ型。たとえば、ファイルのアップロードなど |
2 | CONTENT_LENGTH POST リクエストでのみ利用可能なクエリ情報の長さ。 |
3 | HTTP_COOKIE 設定された Cookie をキーと値のペアの形式で返します。 |
4 | HTTP_USER_AGENT User-Agent リクエスト ヘッダー フィールドには、リクエストを発信したユーザー エージェントに関する情報が含まれます。 Web ブラウザの名前です。 |
5 | PATH_INFO CGI スクリプトのパス。 |
6 | QUERY_STRING GET メソッド リクエストで送信される URL エンコードされた情報。 |
7 | REMOTE_ADDR リクエストを行っているリモート ホストの IP アドレス。これは、ログ記録や認証目的に役立ちます。 |
8 | REMOTE_HOST リクエストを行っているホストの完全修飾名。この情報が利用できない場合、REMOTE_ADDR を使用して IR アドレスを取得できます。 |
9 | REQUEST_METHOD リクエストの作成に使用されたメソッド。最も一般的なメソッドは GET と POST です。 |
10 | SCRIPT_FILENAME CGI スクリプトへのフル パス。 |
11 | SCRIPT_NAME CGI スクリプトの名前。 |
12 | サーバー名 サーバーのホスト名または IP アドレス。 |
13 | SERVER_SOFTWARE サーバーが実行しているソフトウェアの名前とバージョン。 |
以下は、すべての CGI 変数を一覧表示する小さな CGI プログラムです。
#include <iostream> #include <stdlib.h> using namespace std; const string ENV[ 24 ] = { "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE", "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION", "HTTP_HOST", "HTTP_USER_AGENT", "PATH", "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT", "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME", "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN", "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL", "SERVER_SIGNATURE","SERVER_SOFTWARE" }; int main () { cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>CGI Environment Variables</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<table border = \"0\" cellspacing = \"2\">"; for ( int i = 0; i < 24; i++ ) { cout << "<tr><td>" << ENV[ i ] << "</td><td>"; // attempt to retrieve value of environment variable char *value = getenv( ENV[ i ].c_str() ); if ( value != 0 ) { cout << value; } else { cout << "Environment variable does not exist."; } cout << "</td></tr>\n"; } cout << "</table><\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }
C++ CGI ライブラリ
実際の例では、CGI プログラムで多くの操作を行う必要があります。 ftp://ftp.gnu.org/gnu/cgicc/ からダウンロードできる C++ プログラム用に作成された CGI ライブラリがあり、手順に従ってライブラリをインストールできます −
$tar xzf cgicc-X.X.X.tar.gz $cd cgicc-X.X.X/ $./configure --prefix=/usr $make $make install
「C++ CGI Lib ドキュメント」で利用可能な関連ドキュメントを確認できます。
GET および POST メソッド
ブラウザーから Web サーバー、そして最終的には CGI プログラムに情報を渡す必要がある状況に何度も遭遇したことでしょう。ほとんどの場合、ブラウザーは 2 つの方法を使用してこの情報を Web サーバーに渡します。これらのメソッドは、GET メソッドと POST メソッドです。
GET メソッドを使用して情報を渡す
GET メソッドは、エンコードされたユーザー情報をページ要求に追加して送信します。ページとエンコードされた情報は、? で区切られます。次のような文字-
http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
GET メソッドは、ブラウザーから Web サーバーに情報を渡すデフォルトの方法であり、ブラウザーの Location:ボックスに表示される長い文字列を生成します。サーバーに渡すパスワードやその他の機密情報がある場合は、GET メソッドを使用しないでください。 GET メソッドにはサイズ制限があり、リクエスト文字列で最大 1024 文字を渡すことができます。
GET メソッドを使用する場合、情報は QUERY_STRING http ヘッダーを使用して渡され、QUERY_STRING 環境変数を介して CGI プログラムでアクセスできます。
キーと値のペアを任意の URL と連結するだけで情報を渡すことができます。または、HTML
C言語