4

JSON :: RPC :: Clientを使用せず、代わりにLWPを使用して呼び出しを行うという要件が与えられています。

これが私のコードです:

サーバ:

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

両方のクライアントのサーバープロセスが表示されますが、2番目のクライアントにはデータが返されません。

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が表示するような応答文字列が見つかりません。

4

2 に答える 2

2

これはトリッキーなものでした。私の同僚の1人がそれを見つけましたが、彼はStackoverflowに参加していないので、修正を投稿します。

これ:

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

必要なバージョン=>"1.1"、次のように追加されます:

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

なぜこれが重要なのかはわかりませんが、追加すると魅力のように機能しました。

于 2012-01-04T03:30:29.607 に答える
0
  • 「動作していないクライアント」からの出力は何ですか?「成功」または「失敗?」
  • どんな議論をしているのですか?(@ARGV)
  • リクエストオブジェクトをダンプすると、どのような出力が得られますか?
  • 応答オブジェクトをダンプすると、どのような出力が得られますか?
于 2012-01-04T02:37:12.750 に答える