我正在编写一个使用 python JSON-RPC实现的Web应用程序 – 服务器端的 http://json-rpc.org/wiki/python-json-rpc和客户端的jQuery axaj API. 这是我在python中的第一个JSON服务实现,所以我复制了上面提到的
这是我在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")
但是当我尝试在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":""}
我究竟做错了什么?
这是如何在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格式),因此我们可以将它作为对象访问.