Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re: getting values out of RPC::XML response array

by inblosam (Monk)
on May 21, 2004 at 12:49 UTC ( [id://355259]=note: print w/replies, xml ) Need Help??


in reply to getting values out of RPC::XML response array

Okay, I'm having organizational problems. I figured it out for the Frontier::Client code, but not the RPC::XML code, with the OO bless stuff. So if you have any ideas on how to get that out, please help!
my @response = $resp; print "Result is $response[0][0]\n";
This gives me:
Result is RPC::XML::int=SCALAR(0x8123c90)

Replies are listed 'Best First'.
Re^2: getting values out of RPC::XML response array
by dr_k (Novice) on Mar 03, 2008 at 13:07 UTC
    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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://355259]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (5)
As of 2024-04-24 08:28 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found