さて、ではGETやPOSTで送られてきたパラメータを、サーバ側のプログラムで受け取る場合にどうするかを見てみます。
まずはソースコードから。
if( $ENV{'REQUEST_METHOD'} eq "POST" ){ read( STDIN, $query, $ENV{'CONTENT_LENGTH'} ); }else{ $query = $ENV{'QUERY_STRING'}; }
クライアントから送られてきたパラメータは、指定されているURLに基づいて、HTTPサーバによって起動されたプログラムに渡されます。この「パラメータを渡してプログラムを起動する」という一連の動き、およびその「パラメータの渡し方の決まり」がCGIだと思えばよいでしょう。
このとき「$ENV」というのが、プログラムが起動されたときの環境変数です。
REQUEST_METHODという名前の環境変数は、このプログラムが何のコマンドで起動されたのかを保持しています。この環境変数を見ることで、POSTなのかGETなのかを区別することが出来るわけです。
そしてPOSTだった場合には、標準入力からパラメータを読み込みます。上記では「read」関数を使ってqueryという名前の変数にパラメータを読み込んでいます。CONTENT_LENGTHという環境変数は、すべてのパラメータを読み込んだ場合の、データ長を持っていますので、readする場合にはそれを指定します。
一方、GETだった場合には、QUERY_STRINGという環境変数にパラメータが格納されています。なので、これをそのままqueryという名前の変数に設定しています。
これで、POSTの場合でもGETの場合でも、送られてきたパラメータをqueryという変数に格納することができるようになります。
もちろん、プログラムによってはPOSTだけを受け付けたり、GETだけを受け付けたりするだけで良いものもありますから、そこら辺は使い分けることになります。
ところでGETについてですが、GETはそのパラメータ全体が環境変数に格納されてしまいますので、プログラムの実行環境によっては制約を受けることになります。大抵の場合、環境変数はOSに依存するデータ長制限を持っていますので、長大なデータを受け渡すのには適していないと言うべきでしょう。データ長の大きなパラメータ(たとえば、メッセージ文など)を受け渡す必要がある場合には、POSTを使うのが無難と言えます。
では次は、受け取ったパラメータを使いやすいように加工する方法を考えてみます。