Mojo::UserAgentでWeb上のコンテンツをファイルとして保存する / Mojolicious
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するためのメソッドがありませんので、自力でがんばる必要があります。
- getメソッドでHTTPリクエストを発行する。戻り値はMojo::Transaction::HTTPオブジェクト。
- resメソッドでHTTPレスポンスを取得。戻り値は、Mojo::Message::Requestオブジェクト。
- contentメソッドで、コンテンツを取得。戻り値はMojo::Content::Singleオブジェクト。
- assetメソッドで、コンテンツが実際に持っている内容を取得。戻り値はMojo::Asset::MemoryオブジェクトかMojo::Asset::Fileオブジェクト。
- 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を取得している点が異なりますね。