# REST::Consumer A general-purpose client for interacting with RESTful HTTP services ### Synopsis This module provides an interface that encapsulates building an http request, sending, and parsing responses. It also retries on failed requests and has configurable timeouts. ### Usage First configure the REST::Consumer class. This only needs to be done once per process and the results will be cached in a file. You can then refer to the service by name. REST::Consumer->configure('http://somewhere.com/consumer/config'); And / or: REST::Consumer->configure({ 'google-calendar' => { url => 'https://apps-apis.google.com', }, 'google-accounts' => { url => 'https://accounts.google.com', }, }); Then later: my $media = REST::Consumer->service('google-calendar')->get( path => '/users/me/calendarList', timeout => 5, retry => 5, ); use Data::Dumper; print Dumper($media); Example Using Authentication: my $client = REST::Consumer->new( host => 'service.shuttercorp.net', auth => { type => 'basic', username => 'mrbigglesworth', password => 'cupcake', } ) $client->get( path => .... params => {...} ) Example Using Handlers: my $result = $client->post( path => '/foo', ... handlers => { 409 => sub { my ($h) = @_; if ($h->response_parseable) { my $conflicting_user = $h->parsed_response->{user}; # ->parsed_response will raise an error if the response # is not in fact the sort of thing that could be parsed # (e.g. a flat string) return "conflict with $conflicting_user"; } return $h->default; # resume normal flow (retries, etc) }, 420 => sub { # Twitter's custom 'enhance your calm' rate limit my ($h) = @_; # (assuming your code has a $self->logger capability) $self->logger->warn("service is rate-limiting us with drug references"); return $h->retry; # explicit retry is also available (respects retry limit) }, 4xx => sub { my ($h) = @_; # (assuming your code has a $self->logger capability) $self->logger->critical("Bad request! Response body: %s", $h->response_body); die "IncompetentProgrammerException"; }, } ); # $result contains the parsed response, or the string "conflict with ", # or it dies with an IncompetentProgrammerException.