2012-01-03 112 views
4

我已經被要求不使用JSON :: RPC :: Client,而是使用LWP來完成調用。Perl JSON :: RPC ::客戶端使用LWP :: Agent

這裏是我的代碼:

服務器:

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

模塊:

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; 

工作客戶:

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

我看到兩個客戶端的服務器進程,但第二個客戶端沒有數據返回給它。

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所看到的響應字符串。

+1

爲什麼不能使用[JSON :: RPC :: Client](http://p3rl.org/JSON::RPC::Client)或[JSON :: RPC :: LWP](http:// p3rl.org/JSON::RPC::LWP)? – 2012-01-03 19:45:28

+0

他們不想在他們的客戶端機器上安裝額外的庫 – 2012-01-03 21:22:11

+3

然後只是將它們捆綁在一起,好像它們是項目中的文件**完成**。 – 2012-01-03 21:26:35

回答

2

這是一個棘手的問題。我的一位同事發現它,他不在Stackoverflow上,所以我會發布修復程序。

此:

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

所需版本=> 「1.1」,加入到它成爲:

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

不知道爲什麼這事,但一旦它加入它的工作就像一個魅力。

0
  • 「Non Working client」的輸出是什麼? 「成功」或 「失敗?」
  • 你傳遞了​​什麼論點? (@ARGV)
  • 如果你 轉儲請求對象,你會得到什麼輸出?
  • 如果你 轉儲響應對象,你會得到什麼輸出?