Amazon-API
view release on metacpan or search on metacpan
lib/Amazon/API.pm view on Meta::CPAN
use parent qw/Amazon::API/;
@API_METHODS = qw/
DeleteRule
DescribeEventBus
DescribeRule
DisableRule
EnableRule
ListRuleNamesByTarget
ListRules
ListTargetsByRule
PutEvents
PutPermission
PutRule
PutTargets
RemovePermission
RemoveTargets
TestEventPattern/;
sub new {
my $class = shift;
my $options = shift || {};
$class->SUPER::new({
%$options,
service_url_base => 'events',
version => undef,
api => 'AWSEvents',
api_methods => \@API_METHODS,
content_type => 'application/x-amz-json-1.1'
});
}
1;
=head1 DESCRIPTION
Class to use for constructing AWS API interfaces. Typically used as
the parent class, but can be used directly. See
C<Amazon::CloudWatchEvents> for an example or sub-classing. See
L</IMPLEMENTATION NOTES> for using C<Amazon::API> directly to call AWS services.
=head1 ERRORS
Errors encountered are returned as an C<Amazon::API::Error> exception
object. See L<Amazon::API::Error>/
=cut
use strict;
use warnings;
use parent qw/Class::Accessor Exporter/;
use Amazon::API::Error;
use Amazon::Credentials;
use AWS::Signature4;
use Data::Dumper;
use HTTP::Request;
use JSON qw/to_json from_json/;
use LWP::UserAgent;
use Scalar::Util qw/reftype/;
use XML::Simple;
__PACKAGE__->follow_best_practice;
__PACKAGE__->mk_accessors(qw/action api api_methods version content_type
http_method credentials response protocol
region url service_url_base
signer target user_agent debug last_action
aws_access_key_id aws_secret_access_key token
/);
use vars qw/@EXPORT $VERSION/;
@EXPORT=qw/$VERSION/;
our $VERSION = '1.1.4-1'; $VERSION=~s/\-.*$//;
=pod
=head1 METHODS
=head2 new
new( options )
=over 5
=item credentials (required)
C<Amazon::Credentials> object or at least an object that
C<->can(get_aws_access_key_id)> and
C<->can(get_aws_secret_access_key)> and C<->can(get_token)>
=item user_agent
Your own user agent object or by default C<LWP::UserAgent>. Using
C<Furl>, if you have it avaiable may result in faster response.
=item api (reqired)
The name of the AWS service. Example: AWSEvents
=item url
The service url. Example: https://events.us-east-1.amazonaws.com
=item debug
0/1 - will dump request/response if set to true.
=item action
The API method. Example: PutEvents
=item content_type
Default content for references passed to the C<invoke_api()> method. The default is C<application/x-amz-json-1.1>.
lib/Amazon/API.pm view on Meta::CPAN
=cut
sub decode_response {
my $self = shift;
my $rsp = $self->get_response;
return undef unless $rsp;
my $result = eval {
if ( $rsp->content_type =~/xml/i) {
XMLin($rsp->content);
}
elsif ( $rsp->content_type =~/json/i ) {
from_json($rsp->content);
}
else {
$rsp->content;
}
};
if ( $@ ) {
$result = $rsp->content;
}
$result;
}
=pod
=head2 submit
submit( options )
C<options> is hash of options:
=over 5
=item content
Payload to send.
=item content_type
Content types we have seen used to send values to AWS APIs:
application/json
application/x-amz-json-1.0
application/x-amz-json-1.1
application/x-www-form-urlencoded
=back
=cut
sub submit {
my $self = shift;
my %options = @_;
my $request = HTTP::Request->new($self->get_http_method || 'POST', $self->get_url);
# 1. set the header
# 2. set the content
# 3. sign the request
# 4. send the request & return result
# see IMPLEMENTATION NOTES for an explanation
if ( $self->get_api ) {
if ( $self->get_version) {
$self->set_target(sprintf("%s_%s.%s", $self->get_api, $self->get_version, $self->get_action));
}
else {
$self->set_target(sprintf("%s.%s", $self->get_api, $self->get_action));
}
$request->header('X-Amz-Target', $self->get_target());
}
unless ($self->get_http_method eq 'GET') {
$options{content_type} = $options{content_type} || 'application/x-amz-json-1.1';
$request->content_type($options{content_type});
if ( $options{content_type} eq 'application/x-www-form-url-encoded') {
$options{content} = $self->_finalize_content($options{content});
}
$request->content($options{content});
}
else {
$request->uri(sprintf("%s?%s", $request->uri(), $self->_finalize_content($options{content})));
}
$request->header('X-Amz-Security-Token', $self->get_credentials->get_token)
if $self->get_credentials->get_token;
# sign the request
$self->get_signer->sign($request);
# make the request, return response object
if ( $self->get_debug ) {
print STDERR Dumper([$request]);
}
$self->get_user_agent->request($request);
}
sub _finalize_content {
my $self = shift;
my $content = shift;
my @args = $content if $content;
if ( $content && $content !~/Action=/ || ! $content ) {
push @args, "Action=" . $self->get_action;
}
if ( $self->get_version) {
push @args, "Version=" . $self->get_version
}
return @args ? join('&', @args) : '';
( run in 0.572 second using v1.01-cache-2.11-cpan-39bf76dae61 )