前回のエントリに関して、 LivePostHandler で新しい項目を通知するときは POST を使ったほうが良い、と指摘されたものの、 nicoalert.pl の方で POST するのに必須なAnyEvent::HTTP ::http_post の使い方がわからなかったので get で実装していました。

AE::HTTP を使おうとすると結構骨が折れる作業になります。

現状の AnyEvent::HTTP はなんと HTTP ::Request オブジェクトからのリクエスト送信に対応していないため、自分ですべてのリクエストを組み立てる必要があるようです。

http://unknownplace.org/memo/2009/07/13/1/

このような仕様なので、 AE::HTTP を使うのは非常につらい事になりますが、 miyagawa さんから Tatsumaki::HTTPClient という AnyEvent::HTTP のラッパーがあるのでそれ使うと良いという情報をいただきました。 Tatsumaki::HTTPClient を使うといろいろとうまくやってくれます。ドキュメントがないのが非常に残念ですが、

http://github.com/miyagawa/Tatsumaki/blob/master/lib/Tatsumaki/HTTPClient.pm を読めばやっていることがわかります。

使い方

HTTP ::Request::Common の引数を普通に書いたあとにコールバックを指定してやれば良い。すばらしい!

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use Data::Dumper;
use Tatsumaki::HTTPClient;
use AnyEvent;

my $cv = AE::cv;

my $callback = sub {
    print Dumper \@_;
    print "Done\n";
    $cv->send;
};

my $client = Tatsumaki::HTTPClient->new;
$client->post(
    'http://www.futomi.com/cgi-bin/lecture/form/posttest.cgi',
    [
        name   => 'Gisle Aas',
        email  => 'gisle@aas.no',
        gender => 'M',
        born   => '1964',
        perc   => '3%',
    ],
    $callback
);

$cv->recv;

exit;
__END__