jqueryを備えたpython json rpc -servicerequestnotranslatable
質問
Python JSON -RPC実装を使用してWebアプリケーションを書いています - http://json-rpc.org/wiki/python-json-rpc サーバー側とjQuery axaj APIでクライアント側。これはPythonでの私の最初のJSONサービスの実装であるため、言及されたサイト(Apache 2.2でCGI Run)から例をコピーしました。
#!/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
フォーム投稿(つまり "method =echo¶ms= ...")の場合と同じようにurl-encode。だから、使用してください JSON.stringify
それをシリアル化して設定します contentType
に "application/json"
ではなくJSONを送信していることを意味します "application/x-form-urlencoded"
.
設定 dataType: "json"
jqueryに、返されたデータ(もちろんJSON形式も)を非表示にするように指示するため、オブジェクトとしてアクセスできます。
他のヒント
あなたはおそらくあなたのサービスを実装するのが簡単な時間を持っているでしょう フラスコ, 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()