Python JSON RPC с jQuery - ServiceRequestNotTranshable - PullRequest
3 голосов
/ 06 мая 2011

Я пишу веб-приложение, используя реализацию Python JSON-RPC - http://json -rpc.org / wiki / python-json-rpc на стороне сервера и jQuery axaj API на стороне клиента.Это моя первая реализация сервиса JSON в python, поэтому я скопировал пример с упомянутого сайта (CGI работает на Apache 2.2):

#!/usr/bin/env python

from jsonrpc import handleCGI, ServiceMethod

@ServiceMethod
def echo(msg):
    return msg


if __name__ == "__main__":
    handleCGI()

Все отлично работает с предоставленным классом python ServiceProxy в качестве клиента (вconsole):

from jsonrpc import ServiceProxy
s = ServiceProxy("http://localhost:8080/mypage/bin/controller.py")
print s.echo("hello")

Но когда я пытаюсь сделать ajax-вызов с использованием jQuery в консоли firebug (в контексте моей страницы):

var jqxhr = $.getJSON("bin/controller.py", {"params": ["hello"], "method": "echo", "id": 1}, function(data) { alert('success!'); });

Я постоянно получаю эту ошибку:

{"error":{"message":"","name":"ServiceRequestNotTranslatable"},"result":null,"id":""}

Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 29 ноября 2011

Вот как сделать JSON RPC-вызов в 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);
    },
});

Должен быть методом HTTP POST, чтобы мы могли отправлять данные.

На самом деле данные должны быть строкой в ​​кодировке JSON. Если вы передадите объект, jQuery.ajax будет URL-кодировать его так же, как и для сообщения формы (т.е. "method = echo & params = ..."). Итак, используйте JSON.stringify для его сериализации и установите contentType на "application/json", чтобы показать, что мы отправляем JSON вместо "application/x-form-urlencoded".

Установка dataType: "json" просто говорит jQuery о десериализации возвращаемых данных (также, конечно, в формате JSON), чтобы мы могли обращаться к ним как к объекту.

3 голосов
/ 06 мая 2011

Возможно, вам будет проще внедрить ваш сервис с флягой , , его легко использовать с 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()
...