工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C++ CGIプログラミング入門:Webアプリケーション開発の基礎

CGIとは?

Common Gateway Interface(CGI)は、Webサーバーとカスタムスクリプト間で情報を交換する方法を定義する一連の標準規格です。

Webブラウジングの仕組み

ハイパーリンクをクリックして特定のWebページやURLを閲覧するとき、以下の流れで処理されます。

  1. ブラウザがHTTP Webサーバーに接続し、URL(ファイル名)を要求
  2. WebサーバーがURLを解析し、ファイルを検索。見つかればファイルを返し、見つからなければエラーメッセージを返す
  3. ブラウザがレスポンスを受け取り、ファイルまたはエラーメッセージを表示

ただし、HTTPサーバーを設定して、特定のディレクトリのファイルが要求されたときにファイルを返す代わりにプログラムとして実行し、その出力をブラウザに返すようにできます。これがCGIの基本概念です。

Webサーバーの設定

CGIプログラミングを始める前に、WebサーバーがCGIをサポートし、CGIプログラムを処理するように設定されていることを確認してください。HTTPサーバーで実行されるすべてのCGIプログラムは、事前設定されたディレクトリ(CGIディレクトリ)に置かれます。慣例として/var/www/cgi-binという名前が使われ、CGIファイルの拡張子は慣例として.cgiです(C++実行ファイルであっても)。

Apache Webサーバーはデフォルトで/var/www/cgi-binのCGIプログラムを実行するように設定されています。他のディレクトリを指定する場合はhttpd.confを修正します。

最初の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ディレクトリに配置します。実行前にchmod 755 cplusplus.cgiで実行権限を付与してください。

重要なポイントは最初の行でContent-type:text/html\r\n\r\nを出力していることです。これはブラウザにコンテンツタイプを伝えるHTTPヘッダーの一部です。

HTTPヘッダー

Content-type:text/html\r\n\r\nはHTTPヘッダーの一部で、ブラウザがコンテンツを理解するために送信されます。主なHTTPヘッダーには以下があります。

番号ヘッダーと説明
1Content-type: 返されるファイルの形式を定義するMIME文字列(例: text/html)
2Expires: 情報が無効になる日付。ブラウザがページ更新の判断に使用
3Location: リダイレクト先のURL
4Last-modified: リソースの最終更新日
5Content-length: 返されるデータのバイト数
6Set-Cookie: クッキーを設定

CGI環境変数

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

番号変数名と説明
1CONTENT_TYPE クライアントが送信するコンテンツのデータタイプ(ファイルアップロードなど)
2CONTENT_LENGTH POSTリクエストで利用可能なクエリ情報の長さ
3HTTP_COOKIE 設定されているクッキーのキーと値の組み合わせ
4HTTP_USER_AGENT リクエストを送信したユーザーエージェント(ブラウザ名)の情報
5PATH_INFO CGIスクリプトのパス
6QUERY_STRING GETメソッドで送信されるURLエンコードされた情報
7REMOTE_ADDR リクエストを送信したリモートホストのIPアドレス
8REMOTE_HOST リクエストを送信したホストの完全修飾名
9REQUEST_METHOD リクエストに使用されたメソッド(GET、POSTなど)
10SCRIPT_FILENAME CGIスクリプトのフルパス
11SCRIPT_NAME CGIスクリプトの名前
12SERVER_NAME サーバーのホスト名またはIPアドレス
13SERVER_SOFTWARE サーバーが実行しているソフトウェアの名前とバージョン

C++ CGIライブラリ

実際のアプリケーションでは、GNU cgiccライブラリを使用すると便利です。インストール手順:

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

GETとPOSTメソッド

ブラウザからWebサーバー、そしてCGIプログラムへ情報を渡すには、主にGETメソッドとPOSTメソッドの2つがあります。

GETメソッド

エンコードされたユーザー情報をページリクエストに追加して送信します。ページと情報は?文字で区切られます。

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

GETはデフォルトメソッドですが、パスワードなど機密情報には使用しないでください。また、リクエスト文字列は最大1024文字までという制限があります。情報はQUERY_STRING環境変数でアクセスできます。

POSTメソッド

情報を別メッセージとして送信するため、より信頼性が高い方法です。標準入力としてCGIスクリプトに渡されます。同じCGIプログラムでGETとPOSTの両方を処理できます。

フォームデータの処理例

チェックボックス

複数選択が必要な場合に使用します。queryCheckbox()メソッドでチェック状態を取得できます。

ラジオボタン

単一選択の場合に使用します。getElement()で選択された値を取得します。

テキストエリア

複数行のテキストを渡す場合に使用します。

ドロップダウンボックス

多数の選択肢から1つを選ぶ場合に使用します。

CGIでのクッキー使用

HTTPはステートレスプロトコルですが、商用サイトではページ間でセッション情報を維持する必要があります。クッキーは訪問者の設定、購入履歴、手数料などを記憶・追跡する効率的な方法です。

クッキーの仕組み

サーバーがブラウザにクッキーとしてデータを送信し、ブラウザが受け入れると訪問者のハードドライブにプレーンテキストとして保存されます。同じサイトの別ページを訪れたとき、クッキーが取得可能になり、サーバーは保存された情報を知ることができます。

クッキーは5つの可変長フィールドで構成されます:

クッキーの設定

#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.example.com;\r\n";
    cout << "Set-Cookie:Path = /perl;\n";
    cout << "Content-type:text/html\r\n\r\n";
    cout << "<html><head><title>Cookies in CGI</title></head><body>";
    cout << "Setting cookies" << endl;
    cout << "</body></html>\n";
    return 0;
}

クッキーはContent-typeヘッダーの前にSet-Cookieヘッダーで設定します。

クッキーの取得

クッキーはHTTP_COOKIE環境変数にkey1=value1; key2=value2; ...の形式で格納されます。cgiccライブラリのgetCookieList()で取得できます。

ファイルアップロード

ファイルをアップロードするには、HTMLフォームにenctype="multipart/form-data"を指定し、input type="file"で「参照」ボタンを作成します。CGI側ではgetFile()でファイルを取得し、writeToStream()で保存できます。

C言語

  1. C#名前空間完全ガイド:構成、スコープ、ベストプラクティス
  2. C++演算子完全ガイド:算術・代入・関係・論理・ビット演算子と実例
  3. C++コメント完全ガイド:読みやすく保守しやすいコードのためのベストプラクティス
  4. C++配列を関数に渡す完全ガイド:1次元・多次元配列の実例付き
  5. Cプログラミング入門:初心者向け包括チュートリアル
  6. C++プログラミング言語:概要と主要機能
  7. C++定数とリテラル完全解説:型、構文、ベストプラクティス
  8. C++演算子完全ガイド:種類、使い方、ベストプラクティス
  9. C++数値型完全ガイド:実践的な使い方と数学関数
  10. C++リファレンス完全理解:重要概念とポインタとの違い
  11. C++テンプレート完全ガイド:ジェネリックプログラミングの基礎