work.log

元エンジニアの備忘録的ブログ

PerlからPHPへ配列データをPOSTメソッドで送る

投稿:

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 = 'http://dev.drive.ne.jp/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 = 'http://dev.drive.ne.jp/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メソッドで送る」は以上になります。

おすすめのVPSサーバ

  • OSが選べる
  • VPS同士でLANが組める
  • 複数台構成向き

このブログで使っています。

  • 転送量が多いサービスに
  • 借りてるのは3年間一度もdown無し!

よく見られている記事

  • 本日
  • 週間
  • 月間