tokuhirom's Blog

2010年にXMLRPCをPerl5でつかう方法について考えた(XMLRPC on Plack)

以下のように RPC::XML をつかうとよい。
Following code is XMLRPC server snippet on Plack. This code uses RPC::XML.

use strict;
use warnings;
use Plack::Request;
use Plack::Builder;
use RPC::XML;
use RPC::XML::ParserFactory 'XML::LibXML';

sub res { RPC::XML::response->new(@_) }

my %dispatch_table = (
    'sum' => sub {
        my $args = shift->value;
        return res(0 + $args->{a} + $args->{b});
    },
    'echo' => sub {
        my $args = shift->value;
        return res($args);
    },
);

my $app = sub {
    my $req = Plack::Request->new(@_);
    my $q = RPC::XML::ParserFactory->new()->parse($req->content);
    my $method_name = $q->name;
    my $code = $dispatch_table{$method_name} or return [404, [], ["not found: $method_name"]];
    my $rpc_res = $code->(@{$q->args});
    return [ 200, [ 'Content-Type', 'text/xml' ], [ $rpc_res->as_string ] ];
};
builder {
    enable 'ContentLength';
    $app;
};

クライアントは XMLRPC::Lite をつかってもよいのだが、こちらも同様に RPC::XML を利用して

my $cli = RPC::XML::Client->new('http://localhost:9096/');
my $resp = $cli->send_request('echo', "hello");
say $resp->value;

などとするのがよいのではないか。

XMLRPC::Lite にくらべると RPC::XML の方がインストール時の癖もすくないし、SOAP を前提にしていない分コードもよみやすいように感じる。速度面についても、RPC::XML の方が 7x Faster である。
ref.http://d.hatena.ne.jp/tokuhirom/20100928/1285630821