Business-YQL
view release on metacpan or search on metacpan
lib/Business/YQL.pm view on Meta::CPAN
package Business::YQL;
use Moo;
our $VERSION = '0.0004'; # VERSION
use HTTP::Request::Common qw(GET POST);
use URI;
use URI::QueryParam;
use LWP::UserAgent;
use JSON qw(to_json from_json);
use Carp qw(croak);
use Log::Any qw($log);
use Try::Tiny;
has scheme => (is => 'ro', default => 'http' );
has domain => (is => 'ro', default => 'query.yahooapis.com' );
has version => (is => 'ro', default => 'v1' );
has timeout => (is => 'ro', default => 10 );
has retries => (is => 'ro', default => 3 );
has uri => (
is => 'ro',
lazy => 1,
default => sub {
my $self = shift;
return sprintf '%s://%s/%s/public/yql',
$self->scheme, $self->domain, $self->version;
},
);
has ua => (
is => 'ro',
lazy => 1,
default => sub {
my $self = shift;
my $ua = LWP::UserAgent->new;
$ua->timeout($self->timeout);
return $ua
},
);
sub q {
my ($self, $query) = @_;
croak "Invalid query string"
unless $query;
my %params = (
q => $query,
format => 'json',
env => 'store://datatables.org/alltableswithkeys',
jsonCompat => 'new',
);
my $uri = URI->new($self->uri);
$uri->query_form(%params);
if ($query =~ m/^insert/i) {
return $self->_req(POST $uri);
} else {
return $self->_req(GET $uri);
}
}
sub _req {
my ($self, $req) = @_;
$self->_log_request($req);
my $res = $self->ua->request($req);
$self->_log_response($res);
my $retries = $self->retries;
while ($res->code =~ /^5/x and $retries--) {
sleep 1;
$res = $self->ua->request($req);
}
( run in 1.985 second using v1.01-cache-2.11-cpan-5a3173703d6 )