3

我正在使用 python JSON-RPC 实现编写一个 Web 应用程序 -服务器端的http://json-rpc.org/wiki/python-json-rpc和客户端的 jQuery axaj API。这是我在 python 中的第一个 JSON 服务实现,所以我从提到的站点复制了示例(CGI 在 Apache 2.2 上运行):

#!/usr/bin/env python

from jsonrpc import handleCGI, ServiceMethod

@ServiceMethod
def echo(msg):
    return msg


if __name__ == "__main__":
    handleCGI()

使用提供的 python ServiceProxy 类作为客户端(在控制台中),一切正常:

from jsonrpc import ServiceProxy
s = ServiceProxy("http://localhost:8080/mypage/bin/controller.py")
print s.echo("hello")

但是当我尝试在 firebug 控制台中使用 jQuery 进行 ajax 调用时(在我的页面的上下文中):

var jqxhr = $.getJSON("bin/controller.py", {"params": ["hello"], "method": "echo", "id": 1}, function(data) { alert('success!'); });

我经常收到此错误:

{"error":{"message":"","name":"ServiceRequestNotTranslatable"},"result":null,"id":""}

我究竟做错了什么?

4

2 回答 2

4

这是在 jQuery 中进行 JSON RPC 调用的方法:

$.ajax({url: "bin/controller.py",
    type: "POST",
    contentType: "application/json",
    data: JSON.stringify({"jsonrpc": "2.0",
        "method": "echo", "params": ["hello",], "id": 1,
    }),
    dataType: "json",
    success: function(response) {
        alert(response.result);
    },
});

需要是 HTTP POST 方法,以便我们可以发送数据。

数据实际上需要是 JSON 编码的字符串。如果您传递一个对象,jQuery.ajax将对其进行 URL 编码,就像对表单发布一样(即“method=echo¶ms=...”)。因此,使用JSON.stringify来序列化它,并设置contentType"application/json"表示我们正在发送 JSON 而不是"application/x-form-urlencoded".

设置dataType: "json"只是告诉 jQuery 反序列化返回的数据(当然也是 JSON 格式),因此我们可以将其作为对象访问。

于 2011-11-29T07:44:59.053 回答
3

您可能会更轻松地使用flask来实现您的服务,它很容易与 jquery 一起使用

from flask import Flask, jsonify, render_template, request
app = Flask(__name__)

@app.route('/echo')
def echo():
    return jsonify({'result': request.args.get('params')})

@app.route('/')
def index():
    return """<!doctype html><head>
       <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
       <script type="text/javascript">
         $.get('/echo?params=hello', function(data) {
           alert(data['result']);
         });
       </script>
       </head></html>"""

if __name__ == '__main__':
    app.run()
于 2011-05-05T20:34:19.753 回答