|
Perl/CGI研究室 'PERL-LABO' TOPへ |
戻る(History.Back) |
POSTメソッドで送られてきたデータをCGIプログラム内で受信する方法を研究します。
GETメソッドの場合のデータの受け取り方は分かりました。 次はPOSTメソッドの場合のデータの受け取り方です。 でもなんで、ブラウザからのデータの送信方法にGETとPOSTの2通りがあるんでしょうね?
その一番の理由は、たぶん送れるデータの長さです。 GETメソッドの場合、送れるデータの長さはなんでも255バイトまでなんだそうです。 なんでかは分かりませんが、URLの後ろにデータが追加されるっていうGETメソッドの 特徴と関係があるんじゃないですかね。URLの長さそのものにも限界がありそうですし。 でも理由はともかく、GETメソッドで送れるデータの長さの限界がその程度だと いうことは、もっと長いデータを送れる仕組みが欲しいですよね。そこでPOSTメソッドの 登場って感じでしょうか。
POSTメソッドのデータ受け取り方。答えはぶっちゃけ
read(STDIN, $data, $ENV{'CONTENT_LENGTH'});
1行だけです。結構簡単ですね?
readというのは、「データを読み込みます」という関数です。
関数という言葉が出てきましたが、関数というのは、ここでは、
なにか決まった仕事をしてくれるもの、くらいに考えておけばいいでしょうか。
read(なんちゃら)とすると、データを読み込んでくれる、そういうもの、と。
この(なんちゃら)のところですが、1つ目の STDIN というのは標準入力というものです。
これ、POSTメソッドのデータを受け取る時にしか出てきません。だから、
標準入力って何?っていうのは覚えなくてもいいですね。
2つ目の $data っていうのは、この中に読み込んだものを入れてくださいっていう
変数です。3つ目の $ENV{'CONTENT_LENGTH'} というのは、
ブラウザから送られてきたデータの長さが入っている環境変数です。
ウェブサーバーは、POSTメソッドでデータが送られてきた場合、 環境変数 CONTENT_LENGTH にその長さを入れて、CGIプログラムを起動して、 CGIプログラムに対して標準入力で送られてきたデータを入れる、ということを するわけですね。これもきっとCGIで定められたルールなんでしょうね。
上の1行のプログラムを使って、送られてきたデータを変数 $data に
入れて、それを画面に表示するプログラムを作りましょう。
GETメソッドの時に作ったやつをちょこっと修正しました。
#!/usr/bin/perl
print "Content-type: text/html\n";
print "\n";
read(STDIN, $data, $ENV{'CONTENT_LENGTH'});
print "REQUEST_METHOD : $ENV{'REQUEST_METHOD'}<br>\n";
print "CONTENT_LENGTH : $ENV{'CONTENT_LENGTH'}<br>\n";
print "DATA : $data<br>\n";
GETメソッドの研究で使ったフォームを少しだけ修正して再利用しました。 修正したのは、FORMタグのmethod属性です。GETをPOSTに変更しました。 下の入力ボックスに文字列を入力して、送信ボタンを押してください。 別窓が開きます。いろんな文字列でテストできるように、あらかじめ 文字列を入れたフォームをいくつか用意しておきました。
環境変数 REQUEST_METHOD に入っている文字列が POST になりましたね。 そして環境変数 CONTENT_LENGTH の中には確かに入力した文字列の長さが、 $data には送られてきたデータが入っていました。バッチリです。
GETメソッドとの違いは、まず送れるデータの長さに制限がないこと。 あと、GETメソッドのようにURLの後ろにデータが追加されているっていうわけじゃないこと。 大きいのはこの2つでしょうか。 送られてくるデータですが、これはGETメソッドとまったく同じでした。 ですから、本当に受け取り方が違うだけで、受け取った後の処理はGETメソッドでも POSTメソッドでも同じでいいっていうわけです。良かった、これくらいの 違いなら、それほど面倒でもありませんでしたね。
これで、データをCGIプログラムで受け取る方法については理解できました。 でもまだまだこれから。受け取ったデータを処理する方法を研究しなきゃいけません!
|
Perl/CGI研究室 'PERL-LABO' TOPへ |
戻る(History.Back) |
| Copyright (c) 'PERL-LABO' All Rights Reserved. リンクフリーです。 |