Python Json RPC con jQuery - ServiceRequestNotTransLable
Domanda
Sto scrivendo un'applicazione Web utilizzando l'implementazione Python JSON -RPC - http://json-rpc.org/wiki/python-json-rpc Sul lato server e API JQuery AXAJ sul lato client. Questa è la mia prima implementazione del servizio JSON in Python, quindi ho copiato l'esempio dal sito menzionato (CGI Run su Apache 2.2):
#!/usr/bin/env python
from jsonrpc import handleCGI, ServiceMethod
@ServiceMethod
def echo(msg):
return msg
if __name__ == "__main__":
handleCGI()
Tutto funziona bene con la classe Python ServiceProxy fornita come cliente (in console):
from jsonrpc import ServiceProxy
s = ServiceProxy("http://localhost:8080/mypage/bin/controller.py")
print s.echo("hello")
Ma quando provo a fare una chiamata Ajax usando jQuery in Firebug Console (nel contesto della mia pagina):
var jqxhr = $.getJSON("bin/controller.py", {"params": ["hello"], "method": "echo", "id": 1}, function(data) { alert('success!'); });
Ricevo costantemente questo errore:
{"error":{"message":"","name":"ServiceRequestNotTranslatable"},"result":null,"id":""}
Che cosa sto facendo di sbagliato?
Soluzione
Ecco come fare una chiamata JSON RPC 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);
},
});
Deve essere il metodo post HTTP in modo da poter inviare dati.
I dati devono effettivamente essere una stringa nella codifica JSON. Se passi un oggetto, jQuery.ajax
lo acconsenterà URL come farebbe per un post di modulo (cioè metodo = echo¶ms = ... "). Quindi, usa JSON.stringify
per serializzare e impostare contentType
a "application/json"
per significare che stiamo inviando JSON invece di "application/x-form-urlencoded"
.
Ambientazione dataType: "json"
Dice a JQuery di non sincerare i dati restituiti (anche il formato JSON, ovviamente), quindi possiamo accedervi come oggetto.
Altri suggerimenti
Probabilmente avresti più tempo a implementare il tuo servizio con borraccia, È facile da usare con 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()