Webアプリ開発事始 第9回

CGIの仕組みを覗く(2)~ゲストブックの仕組みとプログラミング言語 長谷川裕行
有限会社 手國堂

CGIのデータ受け渡し

CGIプログラムは、Windowsのアプリケーションのようなユーザーインターフェイスを持っていないため、データの受け取り方が異なります。既に述べたように、通常は標準入力からデータを受け取りますが、それ以外の方法もあります。


- FORMタグのMETHODオプション -

CGIプログラムにデータを渡す場合、通常はHTML文書内でFORMタグによる入力領域を作成し、そこに入力されたデータをWebサーバーへ向けて送信することになります。つまりCGIプログラムに対するデータの送信手段は、クライアントのブラウザが受け取ったHTMLデータに記述されている、ということです。

FORMタグで生成したテキストボックスやオプションボタンなどの入力アイテムに対して、ユーザーが入力(または選択などの入力行為)を行った時点では、Webサーバーに対しては何のアクションも発生しません。

Webサーバーに対するアクションは、ユーザーが入力アイテムと共にブラウザに表示されたsubmitボタン※1をクリックすることによって発生します。submitボタンがクリックされたときの動作は、FORMタグの“METHOD”オプションで指定します。

METHODオプションでは、“POST”または“GET”を指定できます。併せてACTIONオプションで、実行するCGIプログラムの名前を指定します。
  FORM METHOD=<POST | GET> ACTION=<プログラム名>

※1 これはボタンに表示された文字列ではなく、「submit(提出)の機能を持つボタン」という意味です。ボタンに“submit”と表示されている場合もあれば、“送信”などとなっている場合もあります


- “METHOD=POST”でデータを渡す -

この方法を使うと、プログラムに対して標準入力からデータが与えられます。テキストボックスを多数配置して、大量のデータをプログラムに与えたい場合には、この方法が便利です。

CGIプログラムが“age.cgi”という名前だとすると、HTML文書内で以下のように記述してデータを渡します。

  FORM METHOD="POST" ACTION="age.cgi"

テキストボックスの名前が“txtName”と“txtBornY”で、それぞれ“taro-yamada”“80”と値が入力されているとき、ユーザーがsubmitボタンをクリックすると、Webサーバーに対して以下のような形でプログラムの実行が指示されます。

  age.cgi?txtName=taro-yamada&txtBrnY=80

 “?”記号以降の文字列が、WebサーバーのCGIを経由して標準入力でCGIプログラムに渡されます。


- “METHOD=GET”でデータを渡す -

プログラムに与えるデータは、Webサーバー側の環境変数として保存されます。環境変数とは、

  変数名=値

という形式の文字列で、

  path=/bin;/usr/bin;/usr/sbin...

などといった情報が記録されています。

CGIプログラムが“age.cgi”という名前だとすると、HTML文書内で以下のように記述してデータを渡します。

  FORM METHOD="GET" ACTION="age.cgi"

テキストボックスの名前が“txtName”と“txtBornY”で、それぞれ“taro-yamada”“80”と値が入力されているとき、ユーザーがsubmitボタンをクリックすると、Webサーバーに対して以下のような形でプログラムの実行が指示されます。

  age.cgi?txtName=taro-yamada&txtBornY=80

“?”記号以降の文字列が、環境変数名“QUERY_STRING”の値として、Webサーバー側の環境領域に保存されます。

CGIプログラムは、その処理内で環境変数“QUERY_STRING”の値を読み取り、これによってクライアントから送られてきたデータを受け取ります。
同時に多数のクライアントがこの処理を行った場合も、Webサーバーの側ではクライアントごとに個別にプログラムが起動され、それぞれ異なる環境領域をあてがわれるため、入力データが間違って処理されることはありません。  但し環境領域はさほど大きくないため、大量のデータを受け渡すには無理があります。


- コマンドライン引数で渡す -

METHODオプションを使わず、CGIプログラムを呼び出すと同時にデータを送信する方法もあります。

コマンドライン引数とは、プログラムの実行時にプログラム名に続けて処理の対象や処理方法などを指示するもので、UNIXでプログラムを起動する場合、一般的に用いられる方法です。

例えば、「ファイル“abc.txt”とディレクトリ“/usr/local”にコピーする」処理では、コピーを行う“cp”コマンドに対して、以下のようにコマンドラインで指示を与えます。

  cp abc.txt /usr/local

コピー元のファイル名とコピー先のディレクトリ名が、コマンドライン引数(パラメータ)です。

この方法でプログラムにデータを渡すには、HTMLファイル内でプログラム名の後ろに“?”記号を付け、その後ろにコマンドライン引数を“+”記号で区切って並べます。

  age.cgi?taro-yamada+80

CGIプログラムの側では、コマンドライン引数として送られてきたデータを読み取り、処理を行います。このときのWebサーバー側のプログラム起動処理は、以下のような形となります。

  age.cgi taro-yamada 80

コマンドライン引数では、あまりたくさんのデータを与えることはできません。シンプルな記号などを使って、「処理結果を表示する/しない」など簡単な処理切替の指示を与えたりする場合に使われます。

図1:3通りのデータ受け取り方法
図1:3通りのデータ受け取り方法



- 目次 -
CGIプログラムの基本構造
CGIのデータ受け渡し
FORMタグのMETHODオプション
“METHOD=POST”でデータを渡す
“METHOD=GET”でデータを渡す
コマンドライン引数で渡す
ゲストブックの仕組み
CGIの長所と短所
CGIとプログラミング言語
慣れた言語が一番
あとがき

Copyright © MESCIUS inc. All rights reserved.