Perl - ошибка «Не ссылка на HASH» при использовании JSON :: RPC :: Client - PullRequest
2 голосов
/ 03 августа 2011

Я новичок в Perl. У меня есть JSON-RPC-сервер, работающий на http://localhost:19000, и мне нужно вызвать 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.

UPD:

Полная трассировка стека:

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

Ответы [ 2 ]

3 голосов
/ 04 августа 2011

Эта ошибка означает, что ваш 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 выполняет внутри, таким образом, чтобы вы могли проверить, что веб-серверфактически сказал в ответ на запрос, который мы сделали.Приведенный выше код выводит текстовое содержимое страницы;это может быть неправильно в вашем случае и взорвется, если возникнет ошибка.Это только средство отладки, помогающее выяснить со стороны клиентского кода, что не так с сервером.

Думаю, на данный момент достаточно предостережений.Удачи.

0 голосов
/ 03 августа 2011

Кажется, это ошибка в методе 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() возвращает скаляр, который может быть числом, строкой, ссылкой на массив, или ссылкой на хеш.

К сожалению, JSON::RPC::ReturnObject->new()не проверяет, что за вещь JSON->decode() вернулась, прежде чем пытаться получить доступ к ней как к хэш-функции.Учитывая вашу ошибку, я собираюсь пойти дальше и предположить, что в вашем случае это было , а не .: -)

Я не знаю, есть ли способ заставить исправление из вашего кода.Я бы рекомендовал связаться с автором и сообщить ему о проблеме и / или сообщить об ошибке .

...