Well, what you got to do is to really really read what author says about RPC::XML methods. I know it sounds kind of harsh, but I know it, because i didn't read carefully and therefore decided to use Frontier::RPC2 which was a HUGE mistake...but first things first:
best explanation is always an example so here is very simple RPC::XML server
#!/usr/bin/perl -w
use RPC::XML;
use RPC::XML::Server;
use Data::Dumper;
# xml rpc server
$server = RPC::XML::Server->new(host => 'localhost', port => '8888', q
+ueue=>'5', no_default=>1, no_http=>0);
$server->add_method({ name => 'test', signature => [ 'struct struct'
+], code => \&test });
$server->server_loop;
sub test {
print Dumper(\@_);
my $serv = shift;
my $hash = shift;
print Dumper(\$hash);
my %hash = %$hash;
print Dumper(\%hash);
if ($hash{called_number_int}) {
return {'answer' => 'OK bejby'};
} else {
return RPC::XML::fault->new('444', 'not good');
}
}
And here's a client to that server:
#!/usr/bin/perl -w
require RPC::XML;
require RPC::XML::Client;
use Data::Dumper;
my @params = ({
'called_number_net'=>{"nat"=>3,"number"=>223344600
+},
'called_number_int'=>'+420223344600',
'event_type'=>1,
});
$cli = RPC::XML::Client->new('http://localhost:8888/RPC2');
$request = RPC::XML::request->new('test', @params);
$resp = $cli->send_request($request);
print Dumper(\$resp);
$hash = $resp->value;
print Dumper (\$hash);
print $hash->{answer};
print "\n";
now if you will start the server and call the client, here's what you will get...
server:
./rpcxmlserver.pl
$VAR1 = [
bless( {
'__response' => bless( {
'_content' => '',
'_rc' => 200,
'_headers' => bless( {
'co
+ntent-type' => 'text/xml',
'ac
+cept' => 'text/xml',
'ac
+cept-encoding' => 'deflate',
'rp
+c-server' => 'RPC::XML::Server/1.44',
'rp
+c-encoding' => 'XML-RPC'
}, 'H
+TTP::Headers' ),
'_msg' => 'OK'
}, 'HTTP::Response' ),
'method_name' => 'test',
'__started' => 1204548264,
'__auto_methods' => 0,
'__method_table' => {
'test' => bless( {
'signature
+' => [
+ 'struct struct'
+ ],
'sig_table
+' => {
+ 'struct' => 'struct'
+ },
'name' =>
+'test',
'code' =>
+sub { "DUMMY" }
}, 'RPC::XML
+::Method' )
},
'__compress_re' => qr/(?-xism:deflate)/,
'__message_temp_dir' => '',
'__auto_updates' => 0,
'__compress' => 'deflate',
'__daemon' => bless( \*Symbol::GEN0, 'HTTP::Daemon'
+ ),
'__message_file_thresh' => 1048576,
'__xpl_path' => [],
'__version' => 'RPC::XML::Server/1.44',
'__path' => '',
'__timeout' => 10,
'__compress_thresh' => 4096,
'__debug' => 0,
'signature' => [
'struct',
'struct'
],
'__requests' => 0,
'__parser' => bless( {
'stack' => [],
'cdata' => '+420223344600'
}, 'RPC::XML::Parser' ),
'__port' => '8888',
'__host' => 'localhost'
}, 'RPC::XML::Server' ),
{
'called_number_net' => {
'nat' => '3',
'number' => '223344600'
},
'event_type' => '1',
'called_number_int' => '+420223344600'
}
];
$VAR1 = \{
'called_number_net' => {
'nat' => '3',
'number' => '223344600'
},
'event_type' => '1',
'called_number_int' => '+420223344600'
};
$VAR1 = {
'called_number_net' => {
'nat' => '3',
'number' => '223344600'
},
'event_type' => '1',
'called_number_int' => '+420223344600'
};
and client:
./rpcxmlklient.pl
$VAR1 = \bless( {
'answer' => bless( do{\(my $o = 'OK bejby')}, 'RPC:
+:XML::string' )
}, 'RPC::XML::struct' );
$VAR1 = \{
'answer' => 'OK bejby'
};
OK bejby
So as you can see, there's a difference between getting data from RPC::XML in server and in client and you probably need both of them...
in server it's these lines:
my $serv = shift;
my $hash = shift;
my %hash = %$hash;
and it works like this -
a) 1st shift loads info from rpc xml, that is not your data...and if you think it's huge, try to change no_default=>1 parameter in server to no_default=>0 ;]
b) 2nd shift loads reference to your data
c) and finally 3rd line makes an object from reference
in client it's
$hash = $resp->value;
And that's it ;)
P.S. - in case you were wondering why NOT to use Frontier::RPC2... apart from many other small things, that can be finally somehow fixed, it CAN'T work with the right format for fault codes and strings, they just aren't there, so by any mean you add them, the output xml rpc string won't be in the right format. RPC::XML on the other hand works with faults like a charm...if you'll remove parameter called_number_int from client, you'll get it. |