Why not adopt me?
NAME
Net::Async::Webservice::DHL - DHL API client, non-blocking
VERSION
version 0.01_5
SYNOPSIS
use IO::Async::Loop;
use Net::Async::Webservice::DHL;
use Data::Printer;
my $loop = IO::Async::Loop->new;
my $dhl = Net::Async::Webservice::DHL->new({
config_file => $ENV{HOME}.'/.naws_dhl.conf',
loop => $loop,
});
$dhl->get_capability({
from => $address_a,
to => $address_b,
is_dutiable => 0,
product_code => 'N',
currency_code => 'GBP',
shipment_value => 100,
})->then(sub {
my ($response) = @_;
p $response;
return Future->wrap();
});
$loop->run;
Alternatively:
use Net::Async::Webservice::DHL;
use Data::Printer;
my $ups = Net::Async::Webservice::DHL->new({
config_file => $ENV{HOME}.'/.naws_dhl.conf',
user_agent => LWP::UserAgent->new,
});
my $response = $dhl->get_capability({
from => $address_a,
to => $address_b,
is_dutiable => 0,
product_code => 'N',
currency_code => 'GBP',
shipment_value => 100,
})->get;
p $response;
DESCRIPTION
This class implements some of the methods of the DHL XML-PI API, using Net::Async::HTTP as a user agent by default (you can still pass something like LWP::UserAgent and it will work). All methods that perform API calls return Futures (if using a synchronous user agent, all the Futures will be returned already completed).
ATTRIBUTES
live_mode
Boolean, defaults to false. When set to true, the live API endpoint will be used, otherwise the test one will. Flipping this attribute will reset "base_url", so you generally don't want to touch this if you're using some custom API endpoint.
base_url
A URI object, coercible from a string. The base URL to use to send API requests to. Defaults to the standard DHL endpoints:
https://xmlpi-ea.dhl.com/XMLShippingServlet
for livehttps://xmlpitest-ea.dhl.com/XMLShippingServlet
for testing
See also "live_mode".
username
password
Strings, required. Authentication credentials.
user_agent
A user agent object, looking either like Net::Async::HTTP (has do_request
and POST
) or like LWP::UserAgent (has request
and post
). You can pass the loop
constructor parameter to get a default Net::Async::HTTP instance.
METHODS
new
Async:
my $dhl = Net::Async::Webservice::DHL->new({
loop => $loop,
config_file => $file_name,
});
Sync:
my $dhl = Net::Async::Webservice::DHL->new({
user_agent => LWP::UserAgent->new,
config_file => $file_name,
});
In addition to passing all the various attributes values, you can use a few shortcuts.
loop
-
a IO::Async::Loop; a locally-constructed Net::Async::HTTP will be registered to it and set as "user_agent"
config_file
-
a path name; will be parsed with Config::Any, and the values used as if they had been passed in to the constructor
get_capability
$dhl->get_capability({
from => $address_a,
to => $address_b,
is_dutiable => 0,
product_code => 'N',
currency_code => 'GBP',
shipment_value => 100,
}) ==> ($hashref)
from
and to
are instances of Net::Async::Webservice::DHL::Address, is_dutiable
is a boolean, product_code
is a DHL product code.
Optional parameters:
date
-
the date/time for the booking, defaults to now; it will converted to UTC time zone
Performs a GetCapability
request. Lots of values in the request are not filled in, this should be used essentially to check for address validity and little more. I'm not sure how to read the response, either.
The Future returned will yield a hashref containing the "interesting" bits of the XML response (as judged by XML::Compile::Schema), or fail with an exception.
xml_request
$dhl->xml_request({
request_method => $string,
data => \%request_data,
}) ==> ($parsed_response);
This method is mostly internal, you shouldn't need to call it.
It builds a request XML document by passing the given data
to an XML::Compile writer built on the DHL DCTRequest
schema.
It then posts (possibly asynchronously) this to the "base_url" (see the "post" method). If the request is successful, it parses the body with a XML::Compile reader, either the one for DCTResponse
or the one for ErrorResponse
, depending on the document element. If it's DCTResponse
, the Future is completed with the hashref returned by the reader. If it's ErrorResponse
, teh Future is failed with a Net::Async::Webservice::DHL::Exception::DHLError contaning the response status.
post
$dhl->post($body) ==> ($decoded_content)
Posts the given $body
to the "base_url". If the request is successful, it completes the returned future with the decoded content of the response, otherwise it fails the future with a Net::Async::Webservice::DHL::Exception::HTTPError instance.
AUTHOR
Gianni Ceccarelli <gianni.ceccarelli@net-a-porter.com>
COPYRIGHT AND LICENSE
This software is copyright (c) 2014 by Net-a-porter.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.