自分は通常、
use CGI;
$q = new CGI;
$os= $q->param('OS');
という風にフォームからデータを受け取っているのですが、この場合はPOST、GET、両方で受け取ることができるのでしょうか?
form 上での指定はPOSTにしているのですが、アドレス直接打ち込みでGET渡しも生きてくるのでしょうか?
自分で実験したところ、POST、GET両方で可能でした。(POSTだけを有効にしたいのですが、、、。)
基礎的なことなんでしょうけど、私も気になっていましたがよく分かっていなかったので、ちょっと調べてみました。
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod
POSTとURLパラメータの混合
$color = $query->url_param('color');
問い合わせ文字列(引数が後ろについた"?"マーク)が入ったURLへ POSTするフォームを作成することにより、スクリプトはフォームと同じように CGIパラメータをURLで受け取ることは可能です。param()メソッドは、 URLの問い合わせ文字列を無視し、常にPOSTされたフォームの内容を返します。 URLパラメータを取り出すためにはurl_param()メソッドを呼び出してください。 param()と同じように使ってください。大きな違いはパラメータを読むことは常にできますが、設定はできません。
いかなる状況においても、URL問い合わせ文字列の内容がPOSTされたフォームの同じ名前のCGIパラメータを干渉することはありません。URL問い合わせ文字列と GETメソッドでサブミットされるフォームとを混ぜてみると、その結果はあなたが予想しなかったことになるでしょう。
ということは、POSTとURLのどちらもある場合には、POSTが必ず優先されるということになるかと思います。そういう場合に、URL文字列も知りたい、というときに、url_param()を使えと。
こういう認識になると思いますが、如何でしょうか。
POSTでもGETでも意識しないで使えるのがウリらしいです。
OSというパラメータがPOSTであるかの確認は、
$ENV{'REQUEST_METHOD'} の値を調べる
$ENV{'QUERY_STRINGS'} に、OS= の文字列が無い
などのチェックをしてみては?
以前、CGI.pm(cgi-lib.pl だったかも)を使っていましたが、仕様が変わった(らしい)のに気が付かず、原因がわかるまで凄く時間がかかってしまいました。(実際の原因は別にあるのかも知れませんが)
それ以来、自作のスクリプトをライブラリ化して使うようになりました。そんなに難しい処理をするわけではないですし。
ありがとうございます。
GETから受け取る場合はプログラムに別の処理をさせたかったので、、、。
GETで投げるのは簡単そうなので、いたずらずきのちみっ子が、なんかするかもなーとか思ってしまいまして、、、。
POST、GETの両方ともで有効になります。
HTTPリクエストで使われるメソッド(GETとかPOSTとか)はCGIモジュールのrequest_methodメソッドで取得できますので、それを使って振り分ければ解決するでしょう。
use CGI;
my $q = new CGI;
if($q->request_method() == 'POST') {
my $os= $q->param('OS');
....
}
ありがとうございます。これは参考にさせて頂きます!
なるほどー!ありがとうございます。
しかし、POSTだけ有効にしたい、GETだけ有効にしたい、という場合は、url_param()を使ってチェックする必要があるのでしょうか?
うーん、、、。