ブラウザからデータを受け取る

[HOME] [BACK] [NEXT]

CGIが本領を発揮するのは何と言ってもブラウザで入力したデータや決まったデータを受け取って、そのデータに基づいて出力するhtml文をダイナミックに変化させる事です。ここではperlによるGETPOSTデータの処理方法について簡単ですが解説したいと思います。

1.GETとPOST

CGIプログラムは、ブラウザからの起動指定時にGETとPOSTという2種類の方法によりさまざまなデータを受け取る事ができます。 ブラウザから送られてくるデータは、元々表示ページに埋め込まれているものと、ブラウザを開いている人が入力したものの 2通り有ります。GET形式でもPOST形式でもこれら2通りのデータを扱えます。

2.ブラウザからのGETによるデータ送信

例えばhtml文に

<A HREF="http://xx/yy/test.cgi?a=t1&b=t2">テストCGI起動</A>
と記述してあった場合、ブラウザ上の「テストCGI起動」というハイパーリンク部をクリックすると、 「test.cgi」が起動すると共にこのプログラムにWebServer経由で「a=t1&b=t2」というデータが渡されます。 これはブラウザに表示されているページにCGIプログラムが受け取るデータが埋め込まれていた事になります。 また、ブラウザのアドレス入力欄に
http://xx/yy/test.cgi?a=t1&b=t2
と入力してリターンを押すとやはり上と同じく、CGIプログラムが起動されると共にデータが渡されます。 このデータはブラウザを開いている人が入力したデータです。 ## 3.ブラウザからのPOSTによるデータ送信 例えばhtml文に
<FORM ACTION="http://xx/yy/test.cgi" METHOD="POST">   
<INPUT TYPE="hidden" NAME="mode1" VALUE="m1">   
<INPUT TYPE="submit" NAME="sub1" VALUE="テストCGI起動">   
</FORM>

と記述してあった場合、「テストCGI起動」ボタンを押すと「tst.cgi」が起動されると共に、 「mode1」という名前の「m1」という値を持ったデータがWebServer経由でこのCGIプログラムに渡されます。 このデータは「hidden」を使ってページにあらかじめ埋め込まれていたものです。
またhtml文に

<FORM ACTION="http://xx/yy/test.cgi" METHOD="POST">   
<INPUT TYPE="text" NAME="data1">   
<INPUT TYPE="submit" NAME="sub1" VALUE="テストCGI起動">   
</FORM>

と記述してあった場合、「テストCGI起動」ボタンを押すと「tst.cgi」が起動されると共に、 「data1」という名前が付いている(名前は表示されてません)、ブラウザ上に表示されているテキストボックスに、 ブラウザを開いている人が入力したデータがWebServer経由でこのCGIプログラムに渡されます。

4.データ形式とその受け取り方

GETで送られる「a=t1&b=t2」をクエリー文字と呼びます。このデータはCGI環境変数「QUERY_STRING」に入ります。
又POSTで送られるデータは前例ですと「mode1=m1」や「data1=(テキストボックスに入力された文字)」という形で、 送られてきますが、それらを標準入力から取り出すことが出来ます。

QUERY_STRINGに入ったGETデータも標準入力のPOSTデータも「(key1)=(value1)&(key2)=(value)...」という形をしています。 又、CGIの仕様では「&,=,%,+」といった記号や2バイト文字は1バイト毎に16進表記にして頭に「%」を付けるという エンコード作業をしてから送られてきます。
よってCGIプログラムは、データを受け取るために以下の仕事をしなければなりません。

  1. エンコードされているデータのデコードをする。
  2. 区切り文字「&」でデータを分割する。
  3. さらに各々のデータを「key」と「value」に分ける。
  4. POSTの場合、環境変数「CONTENT_LENGTH」に総バイト数がセットされているのでそれをうまく使う。

perlの世界ではこの辺の作業を全部こなしてくれる「cgi-lib.pl」というライブラリーがフリーで手に入ります。 このライブラリーの使い方は次の章で解説します。
(cgi-lib.plを使用して新しいコードを書く人はもういないでしょう。間違いなくCGI.pmを使用するべきです。 2017/3/11)

また、環境変数「REQUESTMETHOD」を参照してGETかPOSTかの判断をする必要も出てくるでしょう。 Perlでは環境変数の値は環境変数名をキーとする「%ENV」ハッシュに格納されていますので
「** $ENV{´REQUEST
METRHOD´} **」を参照すれば「GET」か「POST」の文字が入っています。

このようにして受け取ったデータを基にいろいろな処理を行ってから、再びブラウザからデータを受け取るためのhtml文 をprint文で出力して一旦プログラムは終結し、又ブラウザからデータを受け取る。というのが基本的な流れです。

[HOME] [BACK] [NEXT]

更新日: