Mojo::Clientを使ってみた

(追記)Mojo::ClientはMojo::UserAgentという名前になりました。


まだまだ開発中という感じですが、便利そうなので使ってみました。


まず基本的なリクエスト。

use Mojo::UserAgent;
use Mojo::ByteStream 'b';

my $client = Mojo::UserAgent->new;

# Mojo::Message::Response (http://mojolicio.us/perldoc/Mojo/Message)
my $res = $client->max_redirects(3)->get('http://search.cpan.org/')->res;


取得できたHTMLはCSS3セレクタでデータにアクセスできます。

# Mojo::DOM (http://mojolicio.us/perldoc/Mojo/DOM)
my $dom = $res->dom;

# Iterate
$dom->find('a')->each(sub {
                          my $dom = shift;
                          b($dom->text)->say;
                          b($dom->attrs->{href})->say;
                      });


$dom->find('input[name="query"]')->each(sub {
                                            my $dom = shift;
                                            b($dom->attrs->{type})->say;
                                            b($dom->attrs->{size})->say;
                                    });


POSTは以下のようにできます。

# Form post
my $tx = $client->post_form('http://search.cpan.org/search' => { q => 'mojo' });
if (my $res = $tx->success) {
    b($res->body)->say;
}
else {
    my ($message, $code) = $tx->error;
    b("Error $code: $message")->say;
}


JSONもパースできます。

# JSON
use Mojo::URL;
use Mojo::ByteStream 'b';
use utf8;

my $url = Mojo::URL->new('http://api.atnd.org/events/');
$url->query->param(keyword => 'perl');
$url->query->param(format => 'json');

my $json = $client->get($url)->res->json;

for my $event (@{$json->{events}}) {
    b("title: ", b($event->{title})->encode('UTF-8'))->say;
    b("url: ", $event->{event_url})->say;
    b("--------")->say;
}


今回使ったモジュール

すべてのモジュールが同じ名前空間であることが、なんとなく安心します。


今回のソース
https://gist.github.com/812563