带有 jQ​​uery 的 Python JSON RPC - ServiceRequestNotTranslatable

Posted

技术标签:

【中文标题】带有 jQ​​uery 的 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&params=...”)。因此,使用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,如果第一种方法失败,我会尝试。

以上是关于带有 jQ​​uery 的 Python JSON RPC - ServiceRequestNotTranslatable的主要内容,如果未能解决你的问题,请参考以下文章

带有 jQ​​uery.ajax() 的 CORS

带有 jQ​​uery 验证插件的新 reCaptcha

带有 jQ​​uery 验证插件的引导程序

带有 jQ​​uery 悬停淡入淡出效果的表格

带有 jQ​​uery 的 Django 模板“包含”标签

带有 jQ​​uery 的 Asp Mvc 视图