Вызов jQuery jsonrpc 2.0 через .ajax () дает правильный ответ, но не работает? - PullRequest
4 голосов
/ 16 ноября 2011

Вызов jsonrpc 2.0 через jquery на веб-сервер Tornado получает HTTP-ответ «200 OK» и мой сетевой анализатор показывает расшифрованный ответ как содержащий

{"jsonrpc": "2.0", "error": null, "result": 3500, "id": "jsonrpc"}

То есть действительный ответ jsonrpc 2.0. 3500 также правильный результат, RPC был простой функцией добавления.

Однако firebug не показывает ответ и .ajax success Callback не срабатывает. Обратные вызовы .ajax () error и complete сработал, но не дал мне понять, что проблема Здесь index.html, который запускает вызов ajax ().

    $(document).ready(function(){
       $.ajax({
          url: 'http://localhost:8080', 
          data: JSON.stringify ({jsonrpc:'2.0',method:'add', params:[1400,2100],id:"jsonrpc"} ),  // id is needed !!
          type:"POST",
          dataType:"json",
          success: function (result) { 
                 alert("ok");
          },
          error: function (err,status,thrown) {
                 alert ("this syntax sucks!! " + " ERROR: " + err + " STATUS: " + status + " " + thrown );
          },
          complete: function (xhr,status) { 
                 alert('Complete=>  showing status as: '+ status); 
                 data = $.parseJSON(xhr.responseText);  
                 alert (data);
          } 
       });
    });

1 Ответ

5 голосов
/ 17 ноября 2011

Я понял, что проблема заключается в открытии index.html с использованием Firefox «File Open» вместо того, чтобы мой веб-сервер доставлял мне index.html (просмотрев http://localhost:8080)

Вот полный рабочий примервыполнения вызова JSON RPC и отображения результата с помощью простого предупреждения RPC является базовой функцией сложения.

Чтобы увидеть его в действии:

  • Сохранить индекс.html (2) и webserver.py (1). Отредактируйте webserver.py, чтобы отразить местоположение index.html

  • Запустите webserver.py (chmod a + x webserver.py. sudo./webserver.py)

  • Запустите Firefox и перейдите к localhost: 8080. Это загрузит index.html, вызовет вызов ajax () и отобразит результат с помощью предупреждения.

(1) Веб-сервер Tornado, использующий модуль tornadorpc и написанный на Python. Вот он:

#! /usr/bin/python2.6 

import tornado.httpserver import tornado.ioloop import tornado.web

from tornadorpc.json import JSONRPCHandler from tornadorpc import private, start_server


class MainHandler(tornado.web.RequestHandler):
    def get(self,upath):
        self.write( open('/home/travis/EXPLORE/webApps/index.html').read() )            

class Tree(object):

    def power(self, base, power, modulo=None):
        return pow(base, power, modulo)

    def _private(self):
        # Won't be callable
        return False

class Handler(JSONRPCHandler):

    print ('In Handler()...') 
    tree = Tree()

    def add(self, x, y):
        print ('add()  method called...') 
        return x+y

    def ping(self, obj):
        return obj

# Order is important here.. first matched handler in array is used !! handlers = [
            ('/RPC2',Handler),
            (r"/(.*)", MainHandler),

            ]

start_server(handlers, port=8080)

(2) index.html использует jjery ajax ()метод, чтобы сделать вызов JSONRPC к удаленной процедуре добавления. Убедитесь, что вы сохраняете ее в соответствии сПуть, по которому веб-сервер в (1) пытается прочитать его содержимое.

<html>
<head>
   <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script>

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

         $.ajax({
            url: 'http://localhost:8080/RPC2', 

            data: JSON.stringify ({jsonrpc:'2.0',method:'add', params:[1400,2100],id:"jsonrpc"} ),  // id is needed !!

            type:"POST",

            dataType:"json",
            success:  function (data)       { alert("The result is : " + data.result);},
            error: function (err)  { alert ("Error");}

         });

      });


  </script>


</head>
<body>
  <h1> jQuery JSON RPC 2.0 demo </h1>

</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...