Save content on the web as a file with Mojo::UserAgent

Let's get the file from the web with Mojo::UserAgent and save it. Write as follows.

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 doesn't have a method to download, so you have to do your best on your own.

  1. Issue an HTTP request with the get method. The return value is a Mojo::Transaction::HTTP object.
  2. Get HTTP response with res method. The return value is a Mojo::Message::Request object.
  3. Get the content with the content method. The return value is a Mojo::Content::Single object.
  4. Get what the content actually has with the asset method. The return value is a Mojo::Asset::Memory object or a Mojo::Asset::File object.
  5. Save to a file with the move_to method.

It will be the flow. Is it a little complicated?

When saving a file from Test::Mojo.

When testing Mojolicious, you may want to download a file. In such a case, write as follows. I also included a description of the temporary directory.

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);

The mechanism is the same, except that the Mojo::Transaction::HTTP is obtained from Test::Mojo using the tx method.

Associated Information