ОШИБКА AJAX JSON RPC: [объект объект]

Я пытаюсь вызвать функцию JSON RPC через CGI с помощью perl. Но получаю следующую ошибку.

ОШИБКА: [объект Объект

Может кто-нибудь, пожалуйста, помогите мне в этом? Заранее спасибо.

Test.html

<html>
<head>
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>

<script>
$(document).ready(function() {

                                $.ajax({
                                        type: "POST",
                                        url: "cgi-bin/server.cgi",
                                        data: '{"version": "1.1", "method": "echo", "params" : ["Hello World"]}',
                                        processData: false,
                                        async: false,
                                        timeout: 30000, // msec
                                        contentType: "application/json",
                                        dataType: "json",
                                        success: function(response){
                                                $("body").append( "<br>SUCCESS: " + response.version );
                                                $("body").append( "<br>version: " + response.version );
                                                $("body").append( "<br>result: " + response.result );
                                                $("body").append( "<br>OK" );
                                        },
                                        error: function(response){
                                                $("body").append( "ERROR: " + response );
                                                $("body").append( "<br>" );
                                        }
                                });


});
</script>

</head>
<body>
</body>
</html>

server.cgi

[root@ip-172-31-0-164 cgi-bin]# cat server.cgi #!/usr/bin/perl

use JSON::RPC::Server::CGI;
use strict;

my $server = JSON::RPC::Server::CGI->new;

$server->dispatch('MyApp')->handle();

MyApp.pm

[root@ip-172-31-0-164 cgi-bin]# cat MyApp.pm 
#!/usr/bin/perl

package MyApp;

use base qw(JSON::RPC::Procedure); # Perl 5.6 or more than
use strict;

sub echo : Public {    # new version style. called by clients
     # first argument is JSON::RPC::Server object.
     return $_[1];

}

sub sum : Public(a:num, b:num) { # sets value into object member a, b.
     my ($s, $obj) = @_;
     # return a scalar value or a hashref or an arryaref.
     return $obj->{a} + $obj->{b};
}

1;

person Kasinath Kottukkal    schedule 18.03.2014    source источник


Ответы (1)


Вы получаете Internal Server Error (в виде обычного текста, а не JSON), возвращаемый server.cgi. Мы не видим сообщения (вы не публиковали журналы), поэтому вам необходимо проверить журналы вашего веб-сервера, чтобы выяснить, в чем заключается ошибка на стороне сервера.

Одной из причин может быть то, что у вас не установлена ​​подходящая версия JSON::RPC.

В любом случае вы получаете ERROR: [object Object], потому что пытаетесь вызвать .toString() (вы сделали это неявно, выполнив "..."+response) для объекта XHR (который вы назвали response) в вашем определении обратного вызова .error:

error: function(response){
  $("body").append( "ERROR: " + response );
  $("body").append( "<br>" );
}

Сигнатура метода для .errorfunction error(jqXHR, textStatus, errorThrown). Вы, вероятно, захотите изменить это на:

error: function(xhr, status, error){
  $("body").append( "ERROR: " + error );
  $("body").append( "<br>" );
}

Кроме того, вы не обрабатываете ошибки уровня JSON-RPC (в отличие от уровня HTTP). В вашем обработчике .success вы должны проверить response.error. Если это не ноль, то была выдана ошибка уровня JSON-RPC (скажем, исключение в одном из MyApp subs).

Вы можете справиться с этим следующим образом:

success: function(response){
  if (response.error) {
    $("body").append( "<br>ERROR! " );
    $("body").append( "<br>version: " + response.version );
    $("body").append( "<br>message: " + response.error.message );
    $("body").append( "<br>code: " + response.error.code );
    $("body").append( "<br>FAIL" );
  } else {
    $("body").append( "<br>SUCCESS!");
    $("body").append( "<br>version: " + response.version );
    $("body").append( "<br>result: " + response.result );
    $("body").append( "<br>OK" );
  }
}
person David-SkyMesh    schedule 09.04.2014