Python与jQuery的JSON RPC - ServiceRequestNotTranslatable

3
我正在使用Python JSON-RPC实现编写Web应用程序,服务器端使用http://json-rpc.org/wiki/python-json-rpc,客户端使用jQuery ajax API。 这是我第一次在Python中实现JSON服务,因此我从上述网站复制了示例(在Apache 2.2上运行CGI)。
#!/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")

但是当我尝试在我的页面上下文中使用jQuery在firebug控制台进行ajax调用时:
var jqxhr = $.getJSON("bin/controller.py", {"params": ["hello"], "method": "echo", "id": 1}, function(data) { alert('success!'); });

我经常遇到这个错误:
{"error":{"message":"","name":"ServiceRequestNotTranslatable"},"result":null,"id":""}

我做错了什么?

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&params = ...”)。因此,请使用JSON.stringify对其进行序列化,并将contentType设置为"application/json"以表示我们正在发送JSON而不是"application/x-form-urlencoded"
设置 dataType:“json”仅告诉jQuery反序列化返回的数据(当然也是JSON格式),这样我们就可以将其作为对象访问。

3

如果你使用flaskjquery,实现你的服务可能会更容易。

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()

谢谢 @zeekay,如果第一种方法失败了,我会尝试这个。 - Marek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接