ホーム >> 左脳Script >> Perl >> 「Perl で CGI」POST と GET

「Perl で CGI」POST と GET


「Perl で CGI」基礎編。

POST と GET の扱いの基本。

GET

$ENV{'QUERY_STRING'}」で取得する。

hoge.cgi

#!/usr/bin/perl
print "Content-type:text/html\n\n";
print $ENV{'QUERY_STRING'};
適当にパラメータを付けてアクセスすると、「?」以降のパラメータが表示される。


POST

GET の方法では取得できない。$ENV{'QUERY_STRING'}は空になる。
サーバから stdin (標準入力)経由で送信データを受け取る。

  • read (STDIN, $PostData, $ENV{'CONTENT_LENGTH'});

と書くと、$PostDataへ、パラメータを読み込む事が出来る。


POST と GET の判別

送信方法で、場合分けが出来る。

#!/usr/bin/perl
print "Content-type:text/html\n\n";

$m = $ENV{'REQUEST_METHOD'};
#
if( $m eq 'GET' )
{
    print 'GET:';
    print $ENV{'QUERY_STRING'};
}
if( $m eq 'POST'    )
{
    print 'POST:';
    read (STDIN, $PostData, $ENV{'CONTENT_LENGTH'});
    print $PostData;
}


試行錯誤

上記の基本を踏まえ、いろいろ?やってみた末のコード。

if( 'POST' eq $ENV{'REQUEST_METHOD'}    )
{
    my $buf;
    read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
    #   parameter
    my @pair    =   split(/&/,$buf);
    my %param;
    foreach my $it(@pair)
    {
        my($n,$v) = split(/=/,$it);
        #   url decode
        $v =~ tr/+/ /;
        $v =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
        #   escape
        $v =~ s/&/&/g;
        $v =~ s/</&lt;/g;
        $v =~ s/>/&gt;/g;
        $v =~ s/\"/&quot;/g;
        $v =~ s/\'/&#39;/g;
        #
        $param{$n} = $v;
    }
    #
    foreach my $key ( keys %param )
    {
        print "key:$key : value:$param{$key}", "\n";
    }
}
受け渡しをしたいデータに base64 ライクな文字列があるので、URLデコードの必要性に気付くのが早かった。が、これではパラメータにエンコーディングされた日本語などを突っ込まれると正しくパース出来ない。


結局 CGI.pm

可能性に対応すると時間がかかるので、素直に、かつ楽をするために CGI.pm モジュールに頼る事に決定。
最初から最後まで「車輪の再発明」をする必要はないが、ある程度は自分で試し&進んでみなければ、モジュールの必要性にも理由が付けられない。
やはり理由は必要だ。



トラックバック(0)

トラックバックURL: http://n-yagi.0r2.net/sanoupulurun/mt-tb.cgi/227

コメントする

ホーム >> 左脳Script >> Perl >> 「Perl で CGI」POST と GET

アーカイブ

このブログ記事について

このページは、n-yagiが2009年9月12日 00:15に書いたブログ記事です。

ひとつ前のブログ記事は「「Perl で CGI」事始め」です。

次のブログ記事は「ドット絵エディタ」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。