Perl で、ブラウザから送られてきたデータを CGI.pm を使わずに処理する方法

最も原始的な例は以下のようになるだろう。今さらだけど、知っておいて損はないかもしれない。 HTTP プロトコルの場合、クライアントからサーバにデータを送る方法は POST メソッドか GET メソッドと仕様で定義されているから、POST の場合と GET の場合の2つのパターンを考えてデータを受け取ってあげればよい。 この場合は $buffer に POST または GET で受け取ったデータを格納している。ブラウザから送信されたデータは POST の場合、標準入力 STDIN に入っているので read 関数で読み出し、GET の場合は URL の文字列の中にデータが含まれるので $ENV{QUERY_STRING} から取得している。GET の場合の URL の構成では、キー1=値1&キー2=値2&キー3=値3&... というように、キー=値 が URL 中に含まれる。 もしネットサーフィン(死語?)をしていてブラウザのアドレスバーにごちゃごちゃ長い文字列が並んでいたら、ほとんどの場合は GET でデータを受け渡ししているということ。 以下のコードを test.cgi というファイル名で保存したとき、クライアントから test.cgi が呼び出されると環境変数
  • $ENV{REQUEST_METHOD} : POST か GET の文字列
  • $ENV{QUERY_STRING} : GET で送られてきたデータ
  • $ENV{CONTENT_LENGTH} : 送られてきたデータの文字数
…が入っている。
#!/usr/bin/perl

our $FORM;
my $buffer; # ブラウザから送られてきたデータがこの中に入る。

if($ENV{REQUEST_METHOD} eq 'POST'){
  read(STDIN, $buffer, $ENV{CONTENT_LENGTH');
} elsif($ENV{REQUEST_METHOD} eq 'GET') {
  $buffer=$ENV{QUERY_STRING};
}

my @pairs = split(/&/, $buffer);
foreach my $pair (@pairs) {
  my ($name, $value) = split(/=/, $pair);
  $value =~ tr/+/ /;
  $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  $FORM{$name} = $value;
}

1;
トラックバック URL: https://perltips.twinkle.cc/trackback/291
Posted on 2008-01-21 by yas |