Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

POSTメソッドの研究

研究内容

POSTメソッドで送られてきたデータをCGIプログラム内で受信する方法を研究します。

結果

なぜ2通りの送信方法があるんでしょう

GETメソッドの場合のデータの受け取り方は分かりました。 次はPOSTメソッドの場合のデータの受け取り方です。 でもなんで、ブラウザからのデータの送信方法にGETとPOSTの2通りがあるんでしょうね?

その一番の理由は、たぶん送れるデータの長さです。 GETメソッドの場合、送れるデータの長さはなんでも255バイトまでなんだそうです。 なんでかは分かりませんが、URLの後ろにデータが追加されるっていうGETメソッドの 特徴と関係があるんじゃないですかね。URLの長さそのものにも限界がありそうですし。 でも理由はともかく、GETメソッドで送れるデータの長さの限界がその程度だと いうことは、もっと長いデータを送れる仕組みが欲しいですよね。そこでPOSTメソッドの 登場って感じでしょうか。

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メソッドの時に作ったやつをちょこっと修正しました。

作成したCGIプログラム

post.cgi
#!/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メソッドとの違いは、まず送れるデータの長さに制限がないこと。 あと、GETメソッドのようにURLの後ろにデータが追加されているっていうわけじゃないこと。 大きいのはこの2つでしょうか。 送られてくるデータですが、これはGETメソッドとまったく同じでした。 ですから、本当に受け取り方が違うだけで、受け取った後の処理はGETメソッドでも POSTメソッドでも同じでいいっていうわけです。良かった、これくらいの 違いなら、それほど面倒でもありませんでしたね。

これで、データをCGIプログラムで受け取る方法については理解できました。 でもまだまだこれから。受け取ったデータを処理する方法を研究しなきゃいけません!

分かったこと

  1. 送信方法は環境変数 REQUEST_METHOD で判別できます。POSTメソッドの場合は "POST" になりました。
  2. POSTメソッドの場合、送信データの長さが環境変数 CONTENT_LENGTH で取得できます。
  3. POSTメソッドの場合、標準入力から送信データを読みこみます。
  4. 標準入力からデータを読み込むには、read関数でSTDINを指定します。
  5. 送信データはGETメソッドとまったく同じ。データの取得方法が違うだけでデータは同じものです。
  6. 送信できるデータの長さには制限がありません。
  7. POSTメソッドの場合、URLの後ろに送信データが付加されません。
Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。