Why not adopt me?
NAME
MooX::Role::HTTP::Tiny - HTTP::Tiny as a role for clients that use HTTP
SYNOPSIS
package
My::Client;
use
Moo;
# implent a call to the API of a webservice
sub
call {
my
$self
=
shift
;
my
(
$method
,
$path
,
$args
) =
@_
;
my
$uri
=
$self
->base_uri->clone;
$uri
->path(
$uri
->path =~ m{ / $}x ?
$uri
->path .
$path
:
$path
)
if
$path
;
my
@params
=
$args
? ({
content
=> encode_json(
$args
) }) : ();
if
(
uc
(
$method
) eq
'GET'
) {
my
$query
=
$self
->www_form_urlencode(
$args
);
$uri
->query(
$query
);
shift
(
@params
);
}
printf
STDERR
">>>>> %s => %s (%s) <<<<<\n"
,
uc
(
$method
),
$uri
,
"@params"
;
my
$response
=
$self
->request(
uc
(
$method
),
$uri
,
@params
);
if
(not
$response
->{success}) {
die
sprintf
"ERROR: %s: %s\n"
,
$response
->{reason},
$response
->{content};
}
return
$response
;
}
1;
package
My::API;
use
Moo;
has
client
=> (
is
=>
'ro'
,
isa
=> InstanceOf([
'My::Client'
]),
handles
=> [
qw< call >
],
required
=> 1,
);
sub
fetch_stuff {
my
$self
=
shift
;
return
$self
->call(
@_
);
}
1;
package
main;
use
My::Client;
use
My::API;
my
$client
= My::Client->new(
);
my
$api
= My::API->new(
client
=>
$client
);
my
$response
=
$api
->fetch_stuff(
get
=>
''
, {
q =>
'MooX-Role-HTTP-Tiny'
});
$response
->{content};
ATTRIBUTES
- base_uri [REQUIRED] The base-uri to the webservice
-
The provided uri will be coerced into a URI instance.
- ua A (lazy build) instance of HTTP::Tiny
-
When none is provided, Moo will instantiate a HTTP::Tiny with the extra options provided in the
ua_options
attribute whenever it is first needed.The
request
andwww_form_urlencode
methods will be handled for the role. - ua_options passed through to the constructor of HTTP::Tiny on lazy-build
-
These options can only be passed to constructor of HTTP::Tiny, so won't have impact when an already instantiated
ua
attribute is provided.
REQUIRES
The class that consumes this role needs to implement the method call()
as a wrapper around HTTP::Tiny::request
to suit the remote API one is writing the client for.
DESCRIPTION
This role provides a basic HTTP useragent (based on HTTP::Tiny) for classes that want to implement a client to any webservice that uses the HTTP(S) transport protocol.
Some best known protocols are XMLRPC, JSONRPC and REST, and can be implemented through the required call()
method.
COPYRIGHT
© MMXXI - Abe Timmerman <abeltje@cpan.org>
LICENSE
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.