Python JSON RPC avec jQuery - ServiceRequestNotTranslatable
Question
J'écris une application Web utilisant l'implémentation Python JSON-RPC - http://json-rpc.org/wiki/python-json-rpc côté serveur et API jQuery axaj côté client. C'est ma première implémentation de service JSON en python, j'ai donc copié l'exemple du site mentionné (CGI s'exécute sur Apache 2.2):
#!/usr/bin/env python
from jsonrpc import handleCGI, ServiceMethod
@ServiceMethod
def echo(msg):
return msg
if __name__ == "__main__":
handleCGI()
Tout fonctionne correctement avec la classe python ServiceProxy fournie en tant que client (dans la console):
from jsonrpc import ServiceProxy
s = ServiceProxy("http://localhost:8080/mypage/bin/controller.py")
print s.echo("hello")
Mais quand j'essaye de faire un appel ajax en utilisant jQuery dans la console Firebug (dans le contexte de ma page):
var jqxhr = $.getJSON("bin/controller.py", {"params": ["hello"], "method": "echo", "id": 1}, function(data) { alert('success!'); });
Je reçois constamment cette erreur:
{"error":{"message":"","name":"ServiceRequestNotTranslatable"},"result":null,"id":""}
Qu'est-ce que je fais de mal?
La solution
Voici comment effectuer un appel JSON RPC dans 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);
},
});
Doit être une méthode HTTP POST pour que nous puissions envoyer des données.
Les données doivent en fait être une chaîne en codage JSON.Si vous passez un objet, jQuery.ajax
l'encodera en URL comme il le ferait pour une publication de formulaire (c'est-à-dire "method= echo & params= ...").Donc, utilisez JSON.stringify
pour le sérialiser, et définissez contentType
sur "application/json"
pour indiquer que nous envoyons du JSON au lieu de "application/x-form-urlencoded"
.
La définition de dataType: "json"
indique simplement à jQuery de désérialiser les données renvoyées (également au format JSON, bien sûr), afin que nous puissions y accéder en tant qu'objet.
Autres conseils
Vous auriez probablement plus de facilité à mettre en œuvre votre service avec flask , il est facile à utiliser avec 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()