加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使用LWP :: Agent的Perl JSON :: RPC :: Client

发布时间:2020-12-16 06:14:32 所属栏目:大数据 来源:网络整理
导读:我被要求不使用 JSON :: RPC :: Client,而是使用LWP来进行调用. 这是我的代码: 服务器: #!/usr/bin/perluse strict;use lib ".";use ServerLib;use JSON::RPC::Server::Daemon;die "Do Not run as Rootn" if($ == 0);print "Starting Daemonn";my $daemo
我被要求不使用 JSON :: RPC :: Client,而是使用LWP来进行调用.

这是我的代码:

服务器:

#!/usr/bin/perl

use strict;
use lib ".";

use ServerLib;

use JSON::RPC::Server::Daemon;

die "Do Not run as Rootn" if($< == 0);
print "Starting Daemonn";
my $daemon =  JSON::RPC::Server::Daemon->new(LocalPort => 8000);
$daemon->dispatch({'/jsonrpc/API' => 'ServerLib'})->handle();
exit;

模块:

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 => $messagen";
    print "returning: $messagen";
    my $object = { message => $message,foobar => "garbage" };

    return $object;
 }
package ServerLib::system;

sub describe {
    {
        sdversion => "0.1",name      => 'ServerLib',};
}

1;

工作客户:

#!/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;
 }

非工作客户:

#!/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 "$jsonn";
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 "Failedn";
 }

我看到两个客户端的服务器进程,但第二个客户端没有返回给它的数据.

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)

有人看到我错过了吗?它应该很简单,但由于某种原因,我找不到像RPC :: Client看到的响应字符串.

解决方法

这是一个棘手的问题.我的一个同事找到了它并且他不在Stackoverflow上,所以我将发布修复程序.

这个:

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

需要的版本=> “1.1”,加入它成为:

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

不知道为什么这很重要,但一旦它被添加它就像一个魅力.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读