Mojo::UserAgentでWeb上のコンテンツをファイルとして保存する

Mojo::UserAgentでWeb上からファイルを取得して、保存してみましょう。次のように記述します。

use Mojo::UserAgent;

my $ua = Mojo::UserAgent->new;
my $file = 'google.html';
my $url = 'http://www.google.co.jp/';
$ua->get($url)->res->content->asset->move_to($file);

Mojo::UserAgentにはdownloadするためのメソッドがありませんので、自力でがんばる必要があります。

  1. getメソッドでHTTPリクエストを発行する。戻り値はMojo::Transaction::HTTPオブジェクト。
  2. resメソッドでHTTPレスポンスを取得。戻り値は、Mojo::Message::Requestオブジェクト。
  3. contentメソッドで、コンテンツを取得。戻り値はMojo::Content::Singleオブジェクト。
  4. assetメソッドで、コンテンツが実際に持っている内容を取得。戻り値はMojo::Asset::MemoryオブジェクトかMojo::Asset::Fileオブジェクト。
  5. move_toメソッドで、ファイルに保存。

という流れになります。ちょっと複雑かな。

Test::Mojoからファイルの保存を行う場合。

Mojoliciousのテストをするときに、ファイルをダウンロードしたい場合がありますね。そういう場合は以下のように記述します。一時ディレクトリの記述もいれてみました。

use Test::Mojo;
use File::Temp 'tempdir';
use YourApp;

my $app = YourApp->new;
my $t = Test::Mojo->new($app);
my $tmpdir = tempdir(CLEANUP => 1);
my $tmpfile = "$tmpdir/tmp.tar.gz";

$t->get_ok('http://somehost.com');
  ->tx->res->content->asset->move_to($tmpfile);

仕組みは同じですが、Test::Mojoからtxメソッドを使って、Mojo::Transaction::HTTPを取得している点が異なりますね。

関連情報