2

私はPerlの初心者です。http://localhost:19000で実行されている JSON-RPC サーバーがあり、 checkEmail()メソッドを呼び出す必要があります。

use JSON::RPC::Client;

my $client = new JSON::RPC::Client;
my $url    = 'http://localhost:19000';

my $callobj = { 
    method  => 'checkEmail',
    params  => [ 'rprikhodchenko@gmail.com' ],
};

my $res = $client->call($url, $callobj);

if($res) {
     if ($res->is_error) {
         print "Error : ", $res->error_message;
     }   
     else {
         print $res->result;
     }   
  }
  else {
     print $client->status_line;
  }

起動しようとすると、次のように表示されます。

perl ./check_ac.pl
Not a HASH reference at /usr/local/share/perl/5.10.1/JSON/RPC/Client.pm line 193.

更新:

完全なスタック トレース:

perl -MCarp::Always ./check_ac.pl
Not a HASH reference at /usr/local/share/perl/5.10.1/JSON/RPC/Client.pm line 193
        JSON::RPC::ReturnObject::new('JSON::RPC::ReturnObject', 'HTTP::Response=HASH(0x9938d48)', 'JSON=SCALAR(0x96f1518)') called at /usr/local/share/perl/5.10.1/JSON/RPC/Client.pm line 118
        JSON::RPC::Client::call('JSON::RPC::Client=HASH(0x944a818)', 'http://localhost:19000', 'HASH(0x96f1578)') called at ./check_ac.pl line 11
4

2 に答える 2

3

このエラーは、要件 7.3を満たしていないため、JSON-RPC サーバーが実際には 1 つではないことを意味します。エラーは、JSON-RPC サービスによって返されたドキュメントが整形式 (つまり、JSON オブジェクト) であると想定したときにトリガーJSON::RPC::Clientされ、この想定が誤りであることが判明しました。の作成者へのバグ レポートは、JSON::RPC::Clientより良いエラー メッセージを要求する適切な方法です。

JSON::RPC::Client私は、この種の問題に対処するために、サーバーが何を返し、チョークの原因となっているのかを突き止めました。残念ながら、JRCこれを見つけるための適切なフックポイントを提供できないため、少し注意が必要です。

私は外部ライブラリを編集するのが好きではないので、JSON-RPC サーバーを使用してトラフィックを計測するには、拡張して上書きするアプローチをお勧めします。このようなもの(でcheck_ac.pl):

use Data::Dumper qw();

package JSON::RPC::InstrumentedClient;
use base 'JSON::RPC::Client';

# This would be better done with Module::Install, but I'm limiting dependencies today.
sub _get {
    my ($self, @args) = @_;

    return $self->_dump_response($self->SUPER::_get(@args));
}

sub _post {
    my ($self, @args) = @_;

    return $self->_dump_response($self->SUPER::_post(@args));
}

sub _dump_response {
    my ($self, $response) = @_;

    warn Data::Dumper::Dump([$response->decoded_content], [qw(content)]);
    return $response;
}

package main;

my $client = JSON::RPC::InstrumentedClient->new();
my $url    = 'http://localhost:19000';

... # rest of check_ac.pl

これは、作成したリクエストに応答して Web サーバーが実際に何を言ったかを調べることができるように、内部的にmake_getとmake の呼び出しをラップします。上記のコードは、ページのテキスト コンテンツをダンプします。これはあなたのケースでは正しいことではないかもしれず、エラーが発生すると爆発します. これは、サーバーの何が問題なのかをクライアント コード側から把握するのに役立つデバッグ支援のみです。_postJSON::RPC::Client

今のところ、注意事項はこれで十分だと思います。幸運を。

于 2011-08-03T21:20:24.243 に答える
0

のメソッドnewJSON::RPC::ReturnObjectバグのようです。

sub new {
    my ($class, $obj, $json) = @_;
    my $content = ( $json || JSON->new->utf8 )->decode( $obj->content );

    #...
# line 193
    $content->{error} ? $self->is_success(0) : $self->is_success(1);
    #...
}

$contentJSON::decode()の値は、呼び出しから返されるものになります。しかし、ドキュメントを見るとJSON->decode()、数値、文字列、配列参照、またはハッシュ参照のスカラーを返すようです。

残念ながら、hashref としてアクセスしようとする前に、返されたJSON::RPC::ReturnObject->new()ものの種類をチェックしません。JSON->decode()あなたのエラーを考えると、私は先に進み、あなたのケースで得られたものは1つではなかったと仮定します. :-)

コードから強制的に修正する方法があるかどうかはわかりません。作成者に連絡して問題について知らせるか、バグを報告することをお勧めします。

于 2011-08-03T19:05:54.577 に答える