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?

Était-ce utile?

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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top