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

此错误意味着您的 JSON-RPC 服务器实际上不是一个,因为它不满足要求 7.3。当JSON::RPC::Client假设 JSON-RPC 服务返回的文档是格式正确的(即 JSON 对象)时,就会触发该错误,而这种假设结果是错误的。向作者的错误报告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

_get这包装了对和内部的调用,_post以便JSON::RPC::Client让您检查 Web 服务器在响应我们发出的请求时实际所说的内容。上面的代码转储了页面的文本内容;在您的情况下,这可能不是正确的事情,如果遇到错误会爆炸。它只是一个调试辅助工具,可以帮助您从客户端代码端找出服务器出了什么问题。

我想,这已经足够警告了。祝你好运。

于 2011-08-03T21:20:24.243 回答
0

这似乎是方法new中的JSON::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);
    #...
}

$content的值将是JSON::decode()调用返回的值。但是查看文档,它似乎JSON->decode()返回了一个标量,它可以是一个数字、一个字符串、一个数组引用一个哈希引用。

不幸的是,在尝试将其作为 hashref 访问之前,JSON::RPC::ReturnObject->new()不会检查返回的内容类型。JSON->decode()鉴于您的错误,我将继续假设在您的案例中得到的不是一个。:-)

我不知道是否有办法从您的代码中强制修复。我建议联系作者并让他知道这个问题,和/或提交一个错误

于 2011-08-03T19:05:54.577 回答