(追記)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; }
今回使ったモジュール
- [Mojo::UserAgent - Async IO HTTP 1.1 And WebSocket User Agent
- Mojo::DOM - Minimalistic XML/HTML5 DOM Parser With CSS3 Selectors
- Mojo::JSON - Minimalistic JSON
- Mojo::URL - Uniform Resource Locator
すべてのモジュールが同じ名前空間であることが、なんとなく安心します。