| Protocol-XMLRPC documentation | Contained in the Protocol-XMLRPC distribution. |
http_req_cbProtocol::XMLRPC - Asynchronous, web framework agnostic XML-RPC implementation
my $xmlrpc = Protocol::XMLRPC->new(
http_req_cb => sub {
...
$cb->(..);
}
);
$xmlrpc->call(
'http://example.com/xmlrpc' => 'plus' => [1, 2] => sub {
my ($self, $method_response) = @_;
if (!$method_response) {
print "internal error\n";
}
elsif ($method_response->fault) {
print 'error: ', $method_response->fault, "\n";
}
else {
print $method_response->param->value, "\n";
}
}
);
Protocol::XMLRPC is asynchronous, web framework agnostic XML-RPC implementation. You provide callback subroutine for posting method requests. LWP, Mojo::Client etc can be used for this purpose.
XML-RPC defines different parameters types. Perl5 has only strings, because of this types are guessed, but you can pass explicit type if guessing is wrong for you. Read more about parameter creation at Protocol::XMLRPC::ValueFactory.
http_req_cb my $xmlrpc = Protocol::XMLRPC->new(
http_req_cb => sub {
my ($self, $url, $method, $headers, $body, $cb) = @_;
...
$cb->($self, $status, $headers, $body);
A callback for sending request to the xmlrpc server. Don't forget that User-Agent and Host headers are required by XML-RPC specification. Default values are provided, but you are advised to change them.
Request callback is called with:
Response callback must be called with:
new my $xmlrpc = Protocol::XMLRPC->new(http_req_cb => sub { ... });
Creates Protocol::XMLRPC instance. Argument http_req_cb is required.
call $xmlrpc->call(
'http://example.com/xmlrpc' => 'plus' => [1, 2] => sub {
my ($self, $method_response) = @_;
...
}
);
Creates Protocol::XMLRPC::MethodCall object with provided parameters and calls http_req_cb with url and body. Upon response parses and created Protocol::XMLRPC::MethodResponse object and calls provided callback.
Parameter are optional. But must be provided as an array reference. Parameters types are guessed (more about that in Protocol::XMLRPC::ValueFactory). If you must pass parameter which type cannot be easily guesed, for example you want to pass 1 as a string, you can pass value instance instead of a value.
$xmlrpc->call(
'http://example.com/xmlrpc' => 'getPost' =>
[Protocol::XMLRPC::Value::String->new(1)] => sub {
my ($self, $method_response) = @_;
...
}
);
http://github.com/vti/protocol-xmlrpc/commits/master
Viacheslav Tykhanovskyi, vti@cpan.org.
Copyright (C) 2009, Viacheslav Tykhanovskyi.
This program is free software, you can redistribute it and/or modify it under the same terms as Perl 5.10.
| Protocol-XMLRPC documentation | Contained in the Protocol-XMLRPC distribution. |
package Protocol::XMLRPC; use strict; use warnings; use Protocol::XMLRPC::MethodCall; use Protocol::XMLRPC::MethodResponse; require Carp; our $VERSION = '0.08'; sub new { my $class = shift; my $self = {@_}; bless $self, $class; Carp::croak('http_req_cb is required') unless $self->{http_req_cb}; return $self; } sub http_req_cb { defined $_[1] ? $_[0]->{http_req_cb} = $_[1] : $_[0]->{http_req_cb}; } sub call { my $self = shift; my ($url, $method_name, $args, $cb) = @_; ($cb, $args) = ($args, []) unless $cb; my $method_call = Protocol::XMLRPC::MethodCall->new(name => $method_name); foreach my $arg (@$args) { $method_call->add_param($arg); } my $host = $url; $host =~ s|^http(s)?://||; $host =~ s|/.*$||; my $headers = { 'Content-Type' => 'text/xml', 'User-Agent' => 'Protocol-XMLRPC (Perl)', 'Host' => $host }; $self->http_req_cb->( $self, $url, 'POST', $headers, "$method_call" => sub { my ($self, $status, $headers, $body) = @_; return $cb->($self) unless $status && $status == 200; return $cb->( $self, Protocol::XMLRPC::MethodResponse->parse($body) ); } ); } 1; __END__