ブラウザからデータを受け取る
[HOME] [BACK] [NEXT]CGIが本領を発揮するのは何と言ってもブラウザで入力したデータや決まったデータを受け取って、そのデータに基づいて出力するhtml文をダイナミックに変化させる事です。ここではperlによるGETとPOSTデータの処理方法について簡単ですが解説したいと思います。
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プログラムは、データを受け取るために以下の仕事をしなければなりません。
- エンコードされているデータのデコードをする。
- 区切り文字「&」でデータを分割する。
- さらに各々のデータを「key」と「value」に分ける。
- POSTの場合、環境変数「CONTENT_LENGTH」に総バイト数がセットされているのでそれをうまく使う。
perlの世界ではこの辺の作業を全部こなしてくれる「cgi-lib.pl」というライブラリーがフリーで手に入ります。
このライブラリーの使い方は次の章で解説します。
(cgi-lib.plを使用して新しいコードを書く人はもういないでしょう。間違いなくCGI.pmを使用するべきです。 2017/3/11)
また、環境変数「REQUESTMETHOD」を参照してGETかPOSTかの判断をする必要も出てくるでしょう。
Perlでは環境変数の値は環境変数名をキーとする「%ENV」ハッシュに格納されていますので
「** $ENV{´REQUESTMETRHOD´} **」を参照すれば「GET」か「POST」の文字が入っています。
このようにして受け取ったデータを基にいろいろな処理を行ってから、再びブラウザからデータを受け取るためのhtml文 をprint文で出力して一旦プログラムは終結し、又ブラウザからデータを受け取る。というのが基本的な流れです。
[HOME] [BACK] [NEXT]