Recipe 18.12 Writing an XML-RPC Client
18.12.1 Problem
You want to write a client for an
XML-RPC service.
18.12.2 Solution
Use the XMLRPC::Lite module from the SOAP-Lite
distribution:
use XMLRPC::Lite;
$server = XMLRPC::Lite->proxy("http://server.example.com/path");
$result = $server->call('ClassName.handler', @ARGS);
die $call->faultstring if $call->fault;
print $call->result;
18.12.3 Discussion
A single XML-RPC server may run many services, differentiated by
their method name: ClassName.handler corresponds
to ClassName->handler on the server side;
A.B.method corresponds to
A::B->method; and a call to
handler corresponds to
main->handler.
The proxy is the actual URL of the server. If
you're using a CGI server, the proxy method looks
something like this:
$server->proxy("http://server.example.com/path/to/server.cgi")
There
are three ways to invoke remote methods. The first way is to use the
call method on your XMLRPC::Lite object. The first
argument to call is the remote method name, and
the remaining arguments are parameters for the remote method:
$returned = $server
-> call("getRecordByNumber", 12, { format => "CSV" })
-> result;
The second way to invoke a remote method is to call that method on
the XMLRPC::Lite object. This works only when the remote method name
isn't the same as a method provided by the XMLRPC::Lite object. For
example:
$returned = $server
-> getRecordByNumber(12, { format => "CSV" })
-> result;
The last way to invoke a remote method is with
autodispatch, turning unrequired function calls
and method invocations in your Perl program into XML-RPC requests.
Enable autodispatch with:
use XMLRPC::Lite +autodispatch =>
proxy => "http://server.example.com/path";
$returned = getRecordByNumber(12, { format => "CSV" });
A critical difference between autodispatch and the other styles is
that autodispatch automatically decodes the result into a Perl value
for you. When you use an XMLRPC::Lite object, you must explicitly
invoke the result method to decode the XML-RPC
response into a Perl value.
18.12.4 See Also
Recipe 18.11; Recipe 18.14
|