带有 jQuery 的 Python JSON RPC - ServiceRequestNotTranslatable
Posted
技术标签:
【中文标题】带有 jQuery 的 Python JSON RPC - ServiceRequestNotTranslatable【英文标题】:Python JSON RPC with jQuery - ServiceRequestNotTranslatable 【发布时间】:2011-05-05 20:07:37 【问题描述】:我正在使用 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":""
我做错了什么?
【问题讨论】:
【参考方案1】:这是在 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 格式),因此我们可以将其作为对象访问。
【讨论】:
像魅力一样工作!谢谢。【参考方案2】:使用flask、it's easy to use with 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()
【讨论】:
谢谢@zeekay,如果第一种方法失败,我会尝试。以上是关于带有 jQuery 的 Python JSON RPC - ServiceRequestNotTranslatable的主要内容,如果未能解决你的问题,请参考以下文章