使用 jQuery 的 Python JSON RPC - ServiceRequestNotTranslatable

发布于 2024-11-05 19:31:14 字数 1005 浏览 1 评论 0原文

我正在使用 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":""}

我做错了什么?

I'm writing a web application using python JSON-RPC implementation - http://json-rpc.org/wiki/python-json-rpc on server side and jQuery axaj API on client side.
This is my first JSON service implementation in python, so I've copied the example from mentioned site (CGI run on Apache 2.2):

#!/usr/bin/env python

from jsonrpc import handleCGI, ServiceMethod

@ServiceMethod
def echo(msg):
    return msg


if __name__ == "__main__":
    handleCGI()

Everything works fine with supplied python ServiceProxy class as a client (in console):

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

But when I try to make an ajax call using jQuery in firebug console (in context of my page):

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

I constantly receive this error:

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

What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

羁客 2024-11-12 19:31:14

这是在 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 格式),这样我们就可以将其作为对象访问。

This is how to make a JSON RPC call in jQuery:

$.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);
    },
});

Needs to be HTTP POST method so we can send data.

The data actually needs to be a string in JSON encoding. If you pass an object, jQuery.ajax will URL-encode it like it would for a form post (i.e. "method=echo¶ms=..."). So, use JSON.stringify to serialize it, and set contentType to "application/json" to signify that we're sending JSON instead of "application/x-form-urlencoded".

Setting dataType: "json" just tells jQuery to unserialize the returned data (also JSON format, of course), so we can access it as an object.

温暖的光 2024-11-12 19:31:14

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

You'd probably have an easier time implementing your service with 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()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文