Cplusplus-cpp-web-programming

提供:Dev Guides
移動先:案内検索

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プログラミングを進める前に、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 Header & Description
1

Content-type:

返されるファイルの形式を定義するMIME文字列。 例は、Content-type:text/htmlです。

2

Expires: Date

情報が無効になる日付。 これは、ブラウザがページを更新する必要がある時期を決定するために使用する必要があります。 有効な日付文字列は、1998年1月1日12:00:00 GMTの形式である必要があります。

3

Location: URL

要求されたURLの代わりに返されるURL。 このフィールドを使用して、要求を任意のファイルにリダイレクトできます。

4

Last-modified: Date

リソースの最終変更日。

5

Content-length: N

返されるデータの長さ(バイト単位)。 ブラウザはこの値を使用して、ファイルの推定ダウンロード時間を報告します。

6

Set-Cookie: String

_string_を介して渡されるCookieを設定します。

CGI環境変数

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

Sr.No Variable Name & Description
1

CONTENT_TYPE

クライアントが添付コンテンツをサーバーに送信するときに使用されるコンテンツのデータ型。 たとえば、ファイルのアップロードなど。

2

CONTENT_LENGTH

POST要求でのみ使用可能なクエリ情報の長さ。

3

HTTP_COOKIE

設定されたCookieをキーと値のペアの形式で返します。

4

HTTP_USER_AGENT

User-Agent request-headerフィールドには、リクエストを発信したユーザーエージェントに関する情報が含まれています。 これは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

SERVER_NAME

サーバーのホスト名または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 Documentationで入手可能な関連ドキュメントを確認できます。

GETおよびPOSTメソッド

ブラウザからWebサーバーに、そして最終的にはCGIプログラムに何らかの情報を渡す必要がある場合、多くの状況に遭遇したに違いありません。 ほとんどの場合、ブラウザはこの情報をWebサーバーに渡すために2つの方法を使用します。 これらのメソッドは、GETメソッドとPOSTメソッドです。

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

GETメソッドは、エンコードされたユーザー情報をページリクエストに追加して送信します。 ページとエンコードされた情報は、? 次のような文字-

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

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

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

キーと値のペアを任意のURLと連結するだけで情報を渡すことができます。または、HTML <FORM>タグを使用して、GETメソッドを使用して情報を渡すことができます。

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

GETメソッドを使用してhello_get.pyプログラムに2つの値を渡す簡単なURLを次に示します。

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

以下は、Webブラウザからの入力を処理する cpp_get.cgi 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>Using GET and POST Methods</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("first_name");
   if( !fi->isEmpty() && fi != (*formData).end()) {
      cout << "First name: " << **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 << "Last name: " << **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

これは、次の結果を生成します-

First name: ZARA
Last name: ALI

単純なFORMの例:GETメソッド

次に、HTML FORMと送信ボタンを使用して2つの値を渡す簡単な例を示します。 この入力を処理するために、同じCGIスクリプトcpp_get.cgiを使用します。

<form action = "/cgi-bin/cpp_get.cgi" method = "get">
   First Name: <input type = "text" name = "first_name">  <br/>

   Last Name: <input type = "text" name = "last_name"/>
   <input type = "submit" value = "Submit"/>
</form>

上記のフォームの実際の出力は次のとおりです。 姓と名を入力し、送信ボタンをクリックして結果を確認します。

名前苗字:

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

CGIプログラムに情報を渡すより一般的に信頼できる方法は、POSTメソッドです。 これは、GETメソッドとまったく同じ方法で情報をパッケージ化しますが、?の後にテキスト文字列として送信する代わりに URLで別のメッセージとして送信します。 このメッセージは、標準入力の形式でCGIスクリプトに入力されます。

同じcpp_get.cgiプログラムもPOSTメソッドを処理します。 上記と同じ例を見てみましょう。HTMLFORMと送信ボタンを使用して2つの値を渡しますが、今回は次のようにPOSTメソッドを使用します-

<form action = "/cgi-bin/cpp_get.cgi" method = "post">
   First Name: <input type = "text" name = "first_name"><br/>
   Last Name: <input type = "text" name = "last_name"/>

   <input type = "submit" value = "Submit"/>
</form>

上記のフォームの実際の出力は次のとおりです。 姓と名を入力し、送信ボタンをクリックして結果を確認します。

名前苗字:

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

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

ここに2つのチェックボックスを持つフォームのHTMLコードの例があります-

<form action = "/cgi-bin/cpp_checkbox.cgi" method = "POST" target = "_blank">
   <input type = "checkbox" name = "maths" value = "on"/> Maths
   <input type = "checkbox" name = "physics" value = "on"/> Physics
   <input type = "submit" value = "Select Subject"/>
</form>

このコードの結果は次の形式です-

数学物理学

以下はC ++プログラムです。このプログラムはcpp_checkbox.cgiスクリプトを生成し、Webブラウザからチェックボックスボタンを介して与えられた入力を処理します。

#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>Checkbox Data to 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つだけ選択する必要がある場合は、ラジオボタンが使用されます。

これは、2つのラジオボタンがあるフォームのHTMLコードの例です-

<form action = "/cgi-bin/cpp_radiobutton.cgi" method = "post" target = "_blank">
   <input type = "radio" name = "subject" value = "maths" checked = "checked"/> Maths
   <input type = "radio" name = "subject" value = "physics"/> Physics
   <input type = "submit" value = "Select Subject"/>
</form>

このコードの結果は次の形式です-

数学物理学

以下はC ++プログラムです。このプログラムはcpp_radiobutton.cgiスクリプトを生成して、Webブラウザからラジオボタンを介して与えられた入力を処理します。

#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>Radio Button Data to 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プログラムに渡す

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

以下は、TEXTAREAボックスを持つフォームのHTMLコードの例です-

<form action = "/cgi-bin/cpp_textarea.cgi" method = "post" target = "_blank">
   <textarea name = "textcontent" cols = "40" rows = "4">
      Type your text here...
   </textarea>
   <input type = "submit" value = "Submit"/>
</form>

このコードの結果は次の形式です-

以下はC ++プログラムで、cpp_textarea.cgiスクリプトを生成して、Webブラウザからテキスト領域を介して与えられた入力を処理します。

#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>Text Area Data to 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つだけの場合です。

これは、1つのドロップダウンボックスがあるフォームのHTMLコードの例です-

<form action = "/cgi-bin/cpp_dropdown.cgi" method = "post" target = "_blank">
   <select name = "dropdown">
      <option value = "Maths" selected>Maths</option>
      <option value = "Physics">Physics</option>
   </select>

   <input type = "submit" value = "Submit"/>
</form>

このコードの結果は次の形式です-

数学物理学

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

#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>Drop Down Box Data to 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サイトの場合は、異なるページ間でセッション情報を維持する必要があります。 たとえば、多くのページを完了すると、1人のユーザー登録が終了します。 しかし、すべてのWebページにわたってユーザーのセッション情報を維持する方法。

多くの場合、Cookieの使用は、ユーザーの利便性やサイトの統計情報を改善するために必要な設定、購入、手数料、その他の情報を記憶および追跡する最も効率的な方法です。

使い方

サーバーは、Cookieの形式で訪問者のブラウザにデータを送信します。 ブラウザはCookieを受け入れる場合があります。 存在する場合、訪問者のハードドライブにプレーンテキストレコードとして保存されます。 これで、訪問者がサイトの別のページに到達すると、Cookieを取得できます。 取得されると、サーバーは保存された内容を認識/記憶します。

クッキーは5つの可変長フィールドのプレーンテキストデータレコードです-

  • 有効期限-これは、Cookieの有効期限が切れる日付を示します。 これが空白の場合、訪問者がブラウザを終了すると、Cookieは期限切れになります。
  • ドメイン-これはサイトのドメイン名を示します。
  • パス-これは、Cookieを設定するディレクトリまたはWebページへのパスを示します。 任意のディレクトリまたはページからCookieを取得する場合、これは空白になる場合があります。
  • 安全-このフィールドに「安全」という単語が含まれている場合、Cookieは安全なサーバーでのみ取得できます。 このフィールドが空白の場合、そのような制限はありません。
  • 名前=値-Cookieはキーと値のペアの形式で設定および取得されます。

クッキーを設定する

クッキーをブラウザに送信するのは非常に簡単です。 これらのCookieは、コ​​ンテンツタイプが提出される前にHTTPヘッダーとともに送信されます。 ユーザーIDとパスワードを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.finddevguides.com;\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>Cookies in CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   cout << "Setting cookies" << endl;

   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

この例から、Cookieの設定方法を理解している必要があります。 Set-Cookie HTTPヘッダーを使用して、Cookieを設定します。

ここでは、Expires、Domain、PathなどのCookie属性を設定することはオプションです。 マジックライン "Content-type:text/html \ r \ n \ r \ n を送信する前にCookieが設定されていることは注目に値します。

上記のプログラムをコンパイルしてsetcookies.cgiを作成し、次のリンクを使用してCookieを設定してください。 それはあなたのコンピューターで4つのクッキーを設定します-

/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>Cookies in CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";

  //get environment variables
   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.finddevguides.com
Path/perl

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

ファイルをアップロードするには、HTMLフォームのenctype属性を multipart/form-data に設定する必要があります。 ファイルタイプの入力タグは、「参照」ボタンを作成します。

<html>
   <body>
      <form enctype = "multipart/form-data" action = "/cgi-bin/cpp_uploadfile.cgi"
         method = "post">
         <p>File: <input type = "file" name = "userfile"/></p>
         <p><input type = "submit" value = "Upload"/></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>File Upload in CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

  //get list of files to be uploaded
   const_file_iterator file = cgi.getFile("userfile");
   if(file != cgi.getFiles().end()) {
     //send data type at cout.
      cout << HTTPContentHeader(file->getDataType());
     //write content at cout.
      file->writeToStream(cout);
   }
   cout << "<File uploaded successfully>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

上記の例は、 cout ストリームでコンテンツを書き込むためのものですが、ファイルストリームを開いて、アップロードしたファイルのコンテンツを目的の場所のファイルに保存できます。

このチュートリアルをお楽しみください。 はいの場合は、フィードバックをお送りください。