3

私はpythonJSON-RPC実装を使用してWebアプリケーションを作成しています-サーバー側でhttp://json-rpc.org/wiki/python-json-rpc、クライアント側でjQueryaxajAPI。これは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()

(コンソールで)クライアントとして提供されたpythonServiceProxyクラスですべてが正常に機能します。

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":""}

私は何が間違っているのですか?

4

2 に答える 2

4

jQueryでJSONRPC呼び出しを行う方法は次のとおりです。

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

データを送信できるように、HTTPPOSTメソッドである必要があります。

データは実際にはJSONエンコーディングの文字列である必要があります。オブジェクトを渡すjQuery.ajaxと、フォーム投稿の場合と同じようにURLエンコードされます(つまり、「method = echo&params = ...」)。したがって、を使用JSON.stringifyしてシリアル化し、に設定contentTypeして、"application/json"の代わりにJSONを送信することを示します"application/x-form-urlencoded"

設定dataType: "json"は、返されたデータ(もちろんJSON形式も)のシリアル化を解除するようにjQueryに指示するだけなので、オブジェクトとしてアクセスできます。

于 2011-11-29T07:44:59.053 に答える
3

おそらく、サービスをフラスコで実装する方が簡単でしょう。 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()
于 2011-05-05T20:34:19.753 に答える