Perl スクリプト内から PHP へ配列データを POST メソッドで送るメモ書きです。
PHP で書かれたアプリケーションに Perl から POST しようと思ってスクリプトを書いたのですが、「連想配列に格納した配列データ」を送る時にハマったので忘れないように書いておきたいと思います。
「連想配列に格納した配列データ」はこんなヤツ
my $data = { array => [1, 2, 3] };
目次
スポンサーリンク
PerlからPHPへPOSTするサンプルコード
まずは基本として、Perl から POST メソッドでデータを送るサンプルです。
サンプル http-post.pl は以下のような感じで書いています。
#!/usr/bin/perl use strict; use warnings; use LWP::UserAgent; use HTTP::Request::Common; ## POST する URL my $url = 'https://example.worklog.be/post.php'; ## LWP の設定 my $lwp = LWP::UserAgent->new( agent => 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', timeout => 10 ); ## POST するデータ my $params = { id => 'user', pw => '1234' }; ## POST リクエストを作成して PHP 投げる my $req = POST($url, [$params]); my $res = $lwp->request($req); ## 成功時は応答結果を、失敗時はエラー内容を返す if ($res->is_success) { print $res->content, "\n"; } else { print $res->status_line, "\n"; } exit;
テスト様に用意した PHP の受け側、post.php はこんな感じです。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>post test</title> </head> <body> <?php $post = $_POST; echo "以下のパラメータを受け取りました。\n"; echo "ID = $post[id]\n"; echo "PW = $post[pw]\n"; ?> </body> </html>
この状態で Perl スクリプトから POST してみると以下の様な応答データが返ってきます。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>post test</title> </head> <body> 以下のパラメータを受け取りました。 ID = user PW = 1234 </body> </html>
ここまでは問題なし。次は「連想配列に格納した配列データ」を送るスクリプトを書いてみます。
PerlからPHPへ「連想配列に格納した配列データ」をPOSTするサンプルコード
まずは 駄目 だった例から。
先ほどの Perl スクリプトのハッシュ用に用意した変数 $params ={} に、以下の配列データをセットします。
## POST するデータ my $params = { array = [1, 2, 3] };
そして、PHP 側は以下な感じでダンプデータを出力するように変更します。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>post test</title> </head> <body> <?php $post = $_POST; var_dump( $post ); ?> </body> </html>
この状態で Perl スクリプトから POST してみます。返ってきたデータはわかりやすいようにダンプデータだけ抜き出します。
array(1) { ["array"]=> string(1) "3" }
Perl からは配列データを送ったはずなのに、PHP 側ではただの連想配列データとして受け取ってました。
念のため Perl 側でもデータをダンプしてみます。
$VAR1 = { 'array' => [ 1, 2, 3 ] };
うん、問題ない。
調べたけどよくわからなくて半分詰んでいたのですが、HTML タグの input 要素で同じようなデータを送る時って、name 属性に name=”hoge[]” みたいな事してたなと思い出しダメ元でやってみることに。
## POST するデータ my $params = { 'array[]' = [1, 2, 3] };
この状態でもう一度 POST !!
array(1) { ["array"]=> array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" } }
あ、うまくいった!!
ここで気づいたのですが、そもそもの間違いは Perl 側で ハッシュの中身をダンプしてた事で、この場合は POST リクエスト ($req) をダンプするべきでしたね。とりあえず、うまくいったので OK ですけど。
ちなみに、予め配列に格納しているデータを POST する場合はこんな具合に。
my @array = (1, 2, 3); ## POST するデータ my $params = { 'array[]' = [@array] };
PerlからPHPへ配列をPOSTメソッドで送るスクリプト (完成品)
最後に完成品のコードを載っけておきます。
* Perl 側
#!/usr/bin/perl use strict; use warnings; use LWP::UserAgent; use HTTP::Request::Common; my $url = 'https://example.worklog.be/post.php'; my $lwp = LWP::UserAgent->new( agent => 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', timeout => 10 ); my @array = (1, 2, 3); my $params = { id => 'user', pw => '1234', 'array[]' => [@array] }; my $req = POST($url, [$params]); my $res = $lwp->request($req); if ($res->is_success) { print $res->content, "\n"; } else { print $res->status_line, "\n"; } exit;
* PHP 側
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>post test</title> </head> <body> <?php $post = $_POST; echo "以下のパラメータを受け取りました。\n"; echo "ID = $post[id]\n"; echo "PW = $post[pw]\n"; foreach ($post['array'] as $value) { echo "array = $value\n"; } ?> </body> </html>
そして、実行結果はこんな具合に。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>post test</title> </head> <body> 以下のパラメータを受け取りました。 ID = user PW = 1234 array = 1 array = 2 array = 3 </body> </html>
ちょっと長くなりましたが「PerlからPHPへ配列データをPOSTメソッドで送る」は以上になります。