jQuery jsonrpc 2.0通过.ajax()调用得到正确的响应,但不起作用?

Mar*_*tin 4 ajax jquery

通过jquery到Tornado Web服务器的jsonrpc 2.0调用获得"200 OK"http响应,我的网络嗅探器将解码后的响应显示为包含

{ "jsonrpc": "2.0", "错误":NULL, "结果":3500, "ID": "jsonrpc"}

即有效的jsonrpc 2.0响应.3500也是正确的结果,RPC是一个简单的添加功能.

但是,firebug不会显示响应,并且不会触发.ajax 成功回调.触发了.ajax()错误完整的回调,但没有给出任何关于问题的线索.这是触发ajax()调用的index.html.

    $(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);
          } 
       });
    });
Run Code Online (Sandbox Code Playgroud)

Mar*_*tin 6

我发现问题是使用Firefox"File Open"打开index.html而不是让我的web服务器向我发送index.html(通过浏览http:// localhost:8080)

下面是一个完整的工作示例,用于进行JSON RPC调用并使用简单警报显示结果.RPC是一个基本的附加功能.

要看到它的实际效果:

  • 保存index.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)Web服务器是使用tornadorpc模块并用Python编写的Tornado.这里是:

#! /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)
Run Code Online (Sandbox Code Playgroud)

(2)index.html使用jquery的ajax()方法对添加远程过程进行JSONRPC调用.确保将其保存到的位置与(1)中的Web服务器尝试从中读取其内容的路径相匹配.

<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>
Run Code Online (Sandbox Code Playgroud)