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?

È stato utile?

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top