おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

cgiの作り方(4)

FORMデータのCGI側での受け取り

CGI プログラムの設置

これからCGIプログラムそのものの解説に入ります。プログラム言語はPerlを説明します。CGIプログラムはウェブサーバから呼ばれるので、まず、ウェブサーバがCGIについてどのような設定になっているかを調べなければなりません。例えば、Yahoo のジオシティーズのうち、有料のジオプラスでは、CGIを設置できますが、その場合
1 perlのプログラムの場所は、/usr/bin/perl である。このパスから見て、サーバのOSはUNIX系ですね。
2 perlのスクリプトの拡張子は .cgi または .pl とする。(perlのスクリプトというのは、プログラム言語perlで記述されたプログラムのことです。1で書いた /usr/bin/perl というのは、そのスクリプトを実行するためのプログラムのことです。ちょっとややこしいですが、混乱しないでください)
3 perlスクリプトを設置する場所はユーザがhtml文書を設置できる任意の場所でよい
となっています。
従って、以下のような「XXXXX.cgi」(XXXXXのところはファイル名)というスクリプトを任意の場所に設置します。
#!/usr/bin/perl

以下perlスクリプト
...
なお、CGIスクリプトのパーミッションに実行属性を与えることが必要です。通常これはftpソフトで設定します。

私のPCにはApacheというウェブサーバがインストールされています。この設定では、CGIプログラムは、/usr/lib/cgi-bin に設置することになっています。CGIにアクセスするときは、
http://localhost/(CGIファイル名)
でアクセスできます。html文書は /var/www 以下に設置することになっています。html文書にアクセスするときは
http://localhost/(html文書名)
でアクセスできます。

このように、サーバの設定によってCGIの設置方法が違うので、まずサーバの説明文書を良く読みましょう。

POST データの受け取り方

ウェブサーバは、クライアントからのCGIスクリプトへのリクエストを受け取ると、
1 POSTデータを、CGIスクリプトの標準入力になるようにセットする。
2 HTTPヘッダの内容を環境変数にセットする。
3 CGIスクリプトを起動する
というように動作します。従って、CGIスクリプト側としては、環境変数の中から、POSTデータの長さを知り、そのバイト数分を標準入力から読み込むことによって、POSTデータを手に入れます。
read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
$ENV{'CONTENT_LENGTH'}ですが、perlは%ENVという連想配列を用いて環境変数にアクセスします。連想配列についてここで説明は略しますが、要するに$ENV{'CONTENT_LENGTH'}で、環境変数CONTENT_LENGTHの値を知ることができるということです。この CONTENT_LENGTH という環境変数は、POST データのバイト数を示しています。上記のread文で$query_stringにPOSTデータが読み込まれます。

デコード

FORMタグから送られてくるデータは、URLエンコーディングされていますから、それを元に戻す(デコード)する必要があります。上記の$query_stringから1行ごとにデータを取り出し、それを$stとすると、
$st =~ tr/+/ /;  #スペースの復元
$st =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; #%エンコーディングのデコード
このような形でデコードします。