C++ Web プログラミング


CGIとは何ですか?

  • Common Gateway Interface (CGI) は、Web サーバーとクライアント スクリプトの間で情報を交換する方法を定義する一連の標準です。

  • CGI 仕様は現在 NCSA によって維持されており、CGI は次のように定義されています:

  • Common Gateway Interface (CGI) は、外部ゲートウェイ プログラムを情報サーバー (HTTP サーバーなど) に接続するためのインターフェース標準です。

  • 現在のバージョンは CGI/1.1 で、CGI/1.2 バージョンが進行中です。

Web ブラウズ

CGI の概念をより深く理解するために、ハイパーリンクをクリックし、特定の Web ページまたは URL を参照して、何が起こるかを見てみましょう。

  • ブラウザは HTTP Web サーバーに接続し、ファイル名である URL を要求します。

  • Web サーバーは URL を解析し、ファイル名を探します。要求されたファイルが見つかった場合、Web サーバーはそのファイルをブラウザに送り返します。そうでない場合は、間違ったファイルを要求したことを示すエラー メッセージを送信します。

  • WebブラウザはWebサーバーから応答を取得し、受信した応答に基づいてファイルまたはエラーメッセージを表示します。

しかし、このように構築されたHTTPサーバーは、ディレクトリ内のファイルがリクエストされるたびに、HTTPサーバーはファイルを送り返すのではなく、それをプログラムの形式で実行し、生成された出力を送信します。実行するとブラウザに表示されます。

Common Gateway Interface (CGI) は、アプリケーション (CGI プログラムまたは CGI スクリプトと呼ばれる) が Web サーバーおよびクライアントと対話できるようにする標準プロトコルです。これらの CGI プログラムは、Python、PERL、シェル、C または C++ などで作成できます。

CGI アーキテクチャ図

次の図は CGI のアーキテクチャを示しています:

cgiarch.gif

Web サーバー構成

CGI プログラミングを実行する前に、Web サーバーが CGI をサポートしており、CGI プログラムを処理できるように構成されていることを確認してください。 HTTP サーバーによって実行されるすべての CGI プログラムは、事前構成されたディレクトリに存在する必要があります。このディレクトリは CGI ディレクトリと呼ばれ、通常は /var/www/cgi-bin という名前が付けられます。 CGI ファイルは C++ 実行可能ファイルですが、慣例により拡張子は .cgi です。

デフォルトでは、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 サーバーが構成されており、正常に実行できることを前提としています。任意の CGI プログラムを実行できます。 Perl やシェルなど。

最初の 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 - 第一个 CGI 程序</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<h2>Hello World! 这是我的第一个 CGI 程序</h2>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

上記のコードをコンパイルし、実行可能ファイルに cplusplus.cgi という名前を付けて、このファイルを /var/www/cgi-bin ディレクトリに保存します。 CGI プログラムを実行する前に、chmod 755 cplusplus.cgi UNIX コマンドを使用してファイル モードを変更し、ファイルが実行可能であることを確認してください。実行可能ファイルにアクセスすると、次の出力が表示されます:

Hello World! これは私の最初の CGI プログラムです

上記の C++ プログラムは、出力を STDOUT ファイルに書き込む、つまり画面に表示する単純なプログラムです。ここで、最初の行が Content-type: text/htmlrnrn を出力していることに注目してください。この行はブラウザに送り返され、ブラウザ ウィンドウに表示されるコンテンツのタイプを指定します。 Python を使用してより複雑な CGI プログラムの作成に進むためには、CGI の基本概念を理解する必要があります。 C++ CGI プログラムは、他の外部システム (RDBMS など) と対話できます。

HTTP ヘッダー

Line Content-type:text/htmlrnrn は、ページのコンテンツをより深く理解するためにブラウザーに送信される HTTP ヘッダーの一部です。 HTTP ヘッダー情報の形式は次のとおりです。

HTTP 字段名称: 字段内容
 
例如
Content-type: text/html\r\n\r\n

CGI プログラミングでよく使用される、他にも重要な HTTP ヘッダー情報がいくつかあります。

ヘッダー情報Description
Content-type:MIME文字列、返されるファイル形式を定義します。たとえば、Content-type:text/html などです。
有効期限: 日付の情報は無効な日付になります。ブラウザはこれを使用して、ページをいつ更新する必要があるかを判断します。有効な日付文字列は、01 Jan 1998 12:00:00 GMT の形式である必要があります。
場所: URLこの URL は、要求された URL ではなく、返される URL を指します。これを使用して、リクエストを任意のファイルにリダイレクトできます。
Last-modified: Date リソースの最終変更日。
Content-length: N 返されるデータの長さ (バイト単位)。ブラウザはこの値を使用して、ファイルの推定ダウンロード時間を示します。
Set-Cookie: Stringstringを介してCookieを設定します。

CGI 環境変数

すべての CGI プログラムは次の環境変数にアクセスできます。これらの変数は、CGI プログラムを作成する際に非常に重要な役割を果たします。

変数名説明
CONTENT_TYPEコンテンツのデータ型。クライアントが追加のコンテンツをサーバーに送信するときに使用されます。たとえば、ファイルのアップロードやその他の機能です。
CONTENT_LENGTHクエリ情報の長さ。 POST リクエストでのみ使用できます。
HTTP_COOKIE 設定された Cookie をキーと値のペアとして返します。
HTTP_USER_AGENT ユーザー エージェント リクエスト ヘッダー フィールドは、ブラウザ名、バージョン、その他のプラットフォーム固有の追加情報など、ユーザーが開始したリクエストに関する関連情報を送信します。
PATH_INFO CGI スクリプトへのパス。
QUERY_STRING GET メソッドを通じてリクエストを送信するときの URL エンコード情報 (URL 内の疑問符の後のパラメーターを含む)。
REMOTE_ADDR リクエストを行っているリモートホストの IP アドレス。これは、ログ記録と認証の目的に非常に役立ちます。
REMOTE_HOSTリクエストを行うホストの完全修飾名。この情報が利用できない場合は、REMOTE_ADDR を使用して IP アドレスを取得できます。
REQUEST_METHODリクエストを行うために使用されたメソッド。最も一般的なメソッドは GET と POST です。
SCRIPT_FILENAME CGI スクリプトへのフルパス。
SCRIPT_NAME CGI スクリプトの名前。
SERVER_NAME サーバーのホスト名または IP アドレス。
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 环境变量</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>";
       // 尝试检索环境变量的值
       char *value = getenv( ENV[ i ].c_str() );  
       if ( value != 0 ){
         cout << value;                                 
       }else{
         cout << "环境变量不存在。";
       }
       cout << "</td></tr>\n";
   }
   cout << "</table><\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

C++ CGI ライブラリ

実際のインスタンスでは、CGI プログラムを介して多くの操作を実行する必要があります。 C++ プログラム用に特別に作成された CGI ライブラリがあります。この CGI ライブラリを ftp://ftp.gnu.org/gnu/cgicc/ からダウンロードし、以下の手順に従ってライブラリをインストールできます:

$tar xzf cgicc-X.X.X.tar.gz 
$cd cgicc-X.X.X/ 
$./configure --prefix=/usr 
$make
$make install

[C++ CGI] をクリックできます。 Lib Documentation、関連するライブラリのドキュメントを表示します。

GET メソッドと POST メソッド

何らかの情報をブラウザから Web サーバー、そして最終的に CGI プログラムに渡す必要がある状況に遭遇したことがあるかもしれません。通常、ブラウザはこの情報を Web サーバーに送信するために GET メソッドと POST メソッドという 2 つのメソッドを使用します。

情報を渡すには GET メソッドを使用します

GET メソッドは、ページリクエストに追加されたエンコードされたユーザー情報を送信します。以下に示すように、ページとエンコードされた情報は ? 文字で区切られます:

http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2

GET メソッドは、ブラウザから Web サーバーに情報を送信するデフォルトの方法です。ブラウザのアドレスに長い情報文字列が生成されます。バー。パスワードやその他の機密情報をサーバーに渡す場合は、GET メソッドを使用しないでください。 GET メソッドにはサイズ制限があり、リクエスト文字列で最大 1024 文字を渡すことができます。

GET メソッドを使用する場合、情報の転送には QUERY_STRING http ヘッダーが使用されます。情報には、CGI プログラムの QUERY_STRING 環境変数を使用してアクセスできます。

単純に連結されたキーと値のペアで URL をたどるか、HTML <FORM> タグの GET メソッドを使用して、情報を渡すことができます。

単純な URL の例: Get メソッド

以下は、GET メソッドを使用して 2 つの値を hello_get.py プログラムに渡す単純な URL です。

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

次の例では、Web ブラウザーからの入力を処理する CGI プログラム cpp_get.cgi を生成します。渡された情報には、C++ CGI ライブラリを使用して簡単にアクセスできます:

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>  

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
   
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>使用 GET 和 POST 方法</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("first_name");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "名:" << **fi << endl;  
   }else{
      cout << "No text entered for first name" << endl;  
   }
   cout << "<br/>\n";
   fi = formData.getElement("last_name");  
   if( !fi->isEmpty() &&fi != (*formData).end()) {  
      cout << "姓:" << **fi << endl;  
   }else{
      cout << "No text entered for last name" << endl;  
   }
   cout << "<br/>\n";

   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

次に、上記のプログラムを次のようにコンパイルします:

$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc

cpp_get.cgi を生成し、CGI ディレクトリに置き、次のコマンドを使用してみてください。 リンクにアクセスします:

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

これにより、次の結果が生成されます:

名:ZARA 
姓:ALI

簡単なフォームの例: GET メソッド

これは、HTML フォームを使用した簡単な例であり、送信ボタンは 2 つの値を渡します。同じ CGI スクリプト cpp_get.cgi を使用して入力を処理します。

<form action="/cgi-bin/cpp_get.cgi" method="get">
名:<input type="text" name="first_name">  <br />
 
姓:<input type="text" name="last_name" />
<input type="submit" value="提交" />
</form>

以下は、上記のフォームの実際の出力です。姓名を入力して送信ボタンをクリックすると、結果が表示されます。

POST メソッドを使用して情報を渡します

CGI プログラムに情報を渡すためのより信頼性の高い方法は、POST メソッドです。このメソッドは、情報を URL の ? の後のテキスト文字列として渡すのではなく、別のメッセージとして渡す点を除いて、GET メソッドと同じ方法で情報をパッケージ化します。このメッセージは、標準入力として CGI スクリプトに渡されます。

POST メソッドを処理するために cpp_get.cgi プログラムも使用します。同じ例を取り上げ、HTML フォームと送信ボタンを使用して 2 つの値を渡します。今回のみ、GET メソッドの代わりに、以下に示すように POST メソッドを使用します。

<form action="/cgi-bin/cpp_get.cgi" method="post">
名:<input type="text" name="first_name"><br />
姓:<input type="text" name="last_name" />
 
<input type="submit" value="提交" />
</form>

CGI プログラムにチェックボックスを渡す データ

チェックボックスを使用する場合複数のオプションを選択する必要があります。

次の HTML コードの例は、2 つのチェックボックスを持つフォームです:

<form action="/cgi-bin/cpp_checkbox.cgi" 
         method="POST" 
         target="_blank">
<input type="checkbox" name="maths" value="on" /> 数学
<input type="checkbox" name="physics" value="on" /> 物理
<input type="submit" value="选择学科" />
</form>

次の C++ プログラムは、Web ブラウザーからチェックボックスを通じて与えられる入力を処理する cpp_checkbox.cgi スクリプトを生成します。

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
   bool maths_flag, physics_flag;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递复选框数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   maths_flag = formData.queryCheckbox("maths");
   if( maths_flag ) {  
      cout << "Maths Flag: ON " << endl;  
   }else{
      cout << "Maths Flag: OFF " << endl;  
   }
   cout << "<br/>\n";

   physics_flag = formData.queryCheckbox("physics");
   if( physics_flag ) {  
      cout << "Physics Flag: ON " << endl;  
   }else{
      cout << "Physics Flag: OFF " << endl;  
   }
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

ラジオ ボタンのデータを CGI プログラムに渡します

ラジオ ボタンは、オプションを 1 つだけ選択する必要がある場合に使用します。

次の HTML コード例は、2 つのラジオ ボタンを持つフォームです:

<form action="/cgi-bin/cpp_radiobutton.cgi" 
         method="post" 
         target="_blank">
<input type="radio" name="subject" value="maths" 
                                    checked="checked"/> 数学 
<input type="radio" name="subject" value="physics" /> 物理
<input type="submit" value="选择学科" />
</form>

次の C++ プログラムは、Web ブラウザーからラジオ ボタンを通じて与えられる入力を処理する cpp_radiobutton.cgi スクリプトを生成します。

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递单选按钮数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("subject");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Radio box selected: " << **fi << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

テキストエリアのデータをCGIプログラムに渡す

複数行のテキストをCGIプログラムに渡す必要がある場合、TEXTAREA要素を使用します。

次の HTML コードの例は、TEXTAREA ボックスを含むフォームです:

<form action="/cgi-bin/cpp_textarea.cgi" 
         method="post" 
         target="_blank">
<textarea name="textcontent" cols="40" rows="4">
请在这里输入文本...
</textarea>
<input type="submit" value="提交" />
</form>

次の C++ プログラムは、テキスト エリアを介して Web ブラウザーから与えられる入力を処理する cpp_textarea.cgi スクリプトを生成します。

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递文本区域数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("textcontent");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Text Content: " << **fi << endl;  
   }else{
      cout << "No text entered" << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

ドロップダウン ボックスのデータを CGI プログラムに渡す

複数のオプションが利用可能であるが、選択できるオプションは 1 つまたは 2 つだけである場合にドロップダウン ボックスを使用します。

次の HTML コードの例は、ドロップダウン ボックスを備えたフォームです:

<form action="/cgi-bin/cpp_dropdown.cgi" 
                       method="post" target="_blank">
<select name="dropdown">
<option value="Maths" selected>数学</option>
<option value="Physics">物理</option>
</select>
<input type="submit" value="提交"/>
</form>

次の C++ プログラムは、Web ブラウザーからドロップダウン ボックスを通じて与えられた入力を処理する cpp_dropdown.cgi スクリプトを生成します。

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递下拉框数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("dropdown");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Value Selected: " << **fi << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

CGI での Cookie の使用

HTTP プロトコルはステートレス プロトコルです。ただし、商用 Web サイトの場合は、異なるページ間のセッション情報を維持する必要があります。たとえば、ユーザーは複数ページの手順を完了した後で登録することになる場合があります。しかし、すべての Web ページにわたってユーザーのセッション情報を維持する方法は次のとおりです。

多くの場合、Cookie の使用は、ユーザーの好み、購入、手数料、およびより良い訪問者エクスペリエンスや Web サイトの統計を追求するために必要なその他の情報に関する情報を記憶および追跡する最も効果的な方法です。

仕組み

サーバーは、訪問者のブラウザに Cookie の形式でデータを送信します。ブラウザが Cookie を受け入れると、Cookie は訪問者のハード ドライブにプレーンテキストのレコードとして保存されます。ここで、訪問者が Web サイト上の別のページにアクセスすると、Cookie が取得されます。 Cookie が見つかると、サーバーは何が保存されているかを認識します。

Cookie は、5 つの可変長フィールドを持つプレーン テキスト データ レコードです:

  • Expires : Cookie の有効期限。このフィールドを空白のままにすると、訪問者がブラウザを終了すると Cookie の有効期限が切れます。

  • ドメイン: Web サイトのドメイン名。

  • Path: Cookieが設定されるディレクトリまたはWebページへのパス。任意のディレクトリまたは Web ページから Cookie を取得する場合は、このフィールドを空白のままにすることができます。

  • セキュア: このフィールドに「セキュア」という単語が含まれている場合、Cookie は安全なサーバー経由でのみ取得できます。このフィールドを空白のままにすると、この制限は存在しません。

  • Name=Value : Cookie は、キーと値のペアの形式で設定および取得されます。

Cookieを設定する

ブラウザにCookieを送信するのは非常に簡単です。これらの Cookie は、Content-type フィールドの前に HTTP ヘッダーとともに送信されます。ユーザー ID とパスワードを Cookie として設定したいとします。Cookie を設定する手順は次のとおりです。

#include <iostream>
using namespace std;

int main ()
{
 
   cout << "Set-Cookie:UserID=XYZ;\r\n";
   cout << "Set-Cookie:Password=XYZ123;\r\n";
   cout << "Set-Cookie:Domain=www.w3cschool.cc;\r\n";
   cout << "Set-Cookie:Path=/perl;\n";
   cout << "Content-type:text/html\r\n\r\n";

   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 中的 Cookies</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   cout << "设置 cookies" << endl;  
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

この例から、Cookie の設定方法がわかりました。 Set-Cookie HTTP ヘッダーを使用して Cookie を設定します。

ここで、Cookie を設定するための一部のプロパティ (有効期限、ドメイン、パスなど) はオプションです。 Cookie はライン "Content-type:text/htmlrnrn" を送信する前に設定されることに注意してください。

上記のプログラムをコンパイルし、setcookies.cgi を生成し、以下のリンクを使用して Cookie を設定してみてください。コンピューターに 4 つの Cookie を設定します:

/cgi-bin/setcookies.cgi

Cookie の取得

設定されたすべての Cookie の取得は非常に簡単で、CGI 環境変数 HTTP_COOKIE に保存され、その形式は次のとおりです。

key1=value1;key2=value2;key3=value3....

以下の例は、Cookie を取得する方法を示しています

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc cgi;
   const_cookie_iterator cci;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 中的 Cookies</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";
   
   // 获取环境变量
   const CgiEnvironment& env = cgi.getEnvironment();

   for( cci = env.getCookieList().begin();
        cci != env.getCookieList().end(); 
        ++cci )
   {
      cout << "<tr><td>" << cci->getName() << "</td><td>";
      cout << cci->getValue();                                 
      cout << "</td></tr>\n";
   }
   cout << "</table><\n";
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

次に、上記のプログラムをコンパイルして getcookies.cgi を生成し、次のリンクを使用してコンピューター上で利用可能なすべての Cookie を取得してみます:

/cgi-bin/getcookies。 cgi

これにより、前のセクションで設定した 4 つの Cookie と、コンピューター上の他のすべての Cookie を示すリストが生成されます:

UserID XYZ 
Password XYZ123 
Domain www.w3cschool.cc 
Path /perl

ファイル アップロードの例

ファイルをアップロードするには、HTML フォームに enctype を含める必要があります。属性は次のとおりです。

multipart/form-data に設定されます。ファイル タイプの input タグは、「参照」ボタンを作成します。

<html>
<body>
   <form enctype="multipart/form-data" 
            action="/cgi-bin/cpp_uploadfile.cgi" 
            method="post">
   <p>文件:<input type="file" name="userfile" /></p>
   <p><input type="submit" value="上传" /></p>
   </form>
</body>
</html>

このコードの結果は次の形式になります:

注: 上記の例は意図的に保存されています。アップロードされたファイルはサーバー上で無効になっています。ご自身のサーバーで上記のコードを試すことができます

スクリプトは次のとおりです

cpp_uploadfile.cpp:

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc cgi;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 中的文件上传</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   // 获取要被上传的文件列表
   const_file_iterator file = cgi.getFile("userfile");
   if(file != cgi.getFiles().end()) {
      // 在 cout 中发送数据类型
      cout << HTTPContentHeader(file->getDataType());
      // 在 cout 中写入内容
      file->writeToStream(cout);
   }
   cout << "<文件上传成功>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

上記の例は

cout にあります がコンテンツをストリームに書き込みます。ファイル ストリームを開き、アップロードされたファイル コンテンツをターゲットの場所

にあるファイルに保存します。