Perl JSON :: RPC :: Client Using LWP :: Agent

I was given the requirement not to use JSON :: RPC :: Client, instead use LWP to make calls.

Here is my code:

Server:

#!/usr/bin/perl use strict; use lib "."; use ServerLib; use JSON::RPC::Server::Daemon; die "Do Not run as Root\n" if($< == 0); print "Starting Daemon\n"; my $daemon = JSON::RPC::Server::Daemon->new(LocalPort => 8000); $daemon->dispatch({'/jsonrpc/API' => 'ServerLib'})->handle(); exit; 

Module:

 package ServerLib; use base qw(JSON::RPC::Procedure); # Perl 5.6 or more than use JSON; use Data::Dumper; use Sys::Hostname; use Net::RabbitMQ; use YAML qw( LoadFile ); use strict; $| = 1; my $VERSION = 0.2.0; sub echo : Public(message:string) { my ($s, $obj) = @_; my $message = $obj->{'message'}; print "got message => $message\n"; print "returning: $message\n"; my $object = { message => $message, foobar => "garbage" }; return $object; } package ServerLib::system; sub describe { { sdversion => "0.1", name => 'ServerLib', }; } 1; 

Working client:

 #!/usr/bin/perl use strict; use JSON::RPC::Client; use Data::Dumper; my $client = new JSON::RPC::Client; my $uri = 'http://localhost:8000/jsonrpc/API'; my $obj = { method => 'echo', # or 'MyApp.sum' params => ["my message"], }; my $res = $client->call( $uri, $obj ); if($res){ if ($res->is_error) { print "Error : ", $res->error_message; } else { print Dumper($res->result); } } else { print $client->status_line; } 

Client does not work:

 #!/usr/bin/perl -w use strict; use JSON; use LWP::Simple; use Data::Dumper; my $actionurl = "http://localhost:8000/jsonrpc/API"; my $ua = LWP::UserAgent->new(); $ua->agent("JSONClient/0.1"); my $object = { method => "echo", params => [@ARGV ] }; my $json = to_json($object); print "$json\n"; my $req = HTTP::Request->new(POST => $actionurl); $req->content_type('application/json'); $req->content($json); my $res = $ua->request($req); if ($res->is_success) { print "Succeeded:\n" . Dumper($res->dump); print "DUmp: ". $res->dump; my $result = to_json($res->content); } else { print "Failed\n"; } 

I see a server process for both clients, but the second client has no data returned to it.

 DUmp: HTTP/1.1 200 OK Connection: close Date: Tue, 03 Jan 2012 18:24:24 GMT Server: libwww-perl-daemon/5.827 Content-Type: application/json; charset=UTF-8 Client-Date: Tue, 03 Jan 2012 18:24:24 GMT Client-Peer: 127.0.0.1:8000 Client-Response-Num: 1 (no content) 

Does anyone see what I am missing? It should be pretty simple, but for some reason I cannot find an answer string like RPC :: Client.

+4
source share
2 answers

It was complicated. One of my co-workers found it and it is not in Stackoverflow, so I will send the patch.

It:

 my $object = { method => "echo", params => [@ARGV ] }; 

Required version => "1.1" added to it to become:

 my $object = { method => "echo", params => [@ARGV], version => "1.1",}; 

Not sure why this matters, but once it was added, it worked like a charm.

+2
source
  • What is the result of working with a "Non-working client"? Succeed or Fail?
  • What arguments do you pass? (@ARGV)
  • What result will you get if you unload the request object?
  • What result will you get if you unload the response object?
0
source

Source: https://habr.com/ru/post/1389128/


All Articles