Fork me on GitHub
/ Sweet home / Blog / Archives / Mise à jour du client Python JSON-RPC /

Mise à jour du client Python JSON-RPC

Last update: 2011-03-02 02:14:37

Suite à un billet de Maxence Delannoy et à la correction d'un vieux bug dans le server JSON-RPC du framework Zend, j'ai remis le nez dans mon client Python pour apporter quelques corrections et fonctionnalités:

Exemple:

s = Proxy('http://www.yourdomain.tld/endpoint', 'user', 'password')
result = s.hello()

J'en ai également profité pour ouvrir une page googlecode.

Depuis la correction du bug du ZF on peut penser que ce client est inutile par rapport au client officiel, néanmoins je n'ai pas vu comment m'authentifier avec celui-ci, ni comment utiliser des fonctions de rappel, si c'est supporté.


<< Ressources linguistiques
PDO + MySQLND + DSN = WTF >>
 

Comments

Alexei Vinidiktov

Si j'ai bien compris, les appels de procédures à distance retournent la
reponse en json. Comment faut-il transformer la réponse en données de
type natif de Python? Est-ce qu'il faut utilizer pour ça la bibliothèque
json de Python?

Ou peut-être faut-il employer une approche différente?

En d'autres mots comment mieux utilizer la réponse des RPC dans le
programme?

Merci.

desfrenes

Bonjour,

La classe transforme déjà la chaine JSON en type natif Python (en
utilisant déjà la bibliothèque json de Python), il n'y a donc rien à
faire, la réponse est exploitable telle quelle.

Alexei Vinidiktov

Merci, Mickaël.

J'ai un petit test - un serveur en web2py et un client de bureau (desktop
client) en Python.

Voici comment j'appelle la classe jsonrpc:

service =
Proxy("http://127.0.0.1:8000/welcome/default/private_call/jsonrpc",
"myemail@gmail.com", "mypassword")
result = service._call('getstring',{})
print result

Voilà ce que je reçois comme résultat:

{'result': 'logged in!', 'version': '1.1', 'id':
'49454270-42af-11df-bf2b-00e04c
e0211f', 'error': None}

C'est du json, pas des données en type natif.

J'ai utilizé la classe depuis cette adresse:
http://www.desfrenes.com/python-json-rpc

Alexei Vinidiktov

Je pense que je comprends pourquoi j'ai reçu du json. C'est parce que j'ai
utilizé la mauvaise version de votre classe.

Je viens de faire un autre test. Cette fois-ci avec la version hébergée
sur googlecode et j'ai reçu un résultat en type natif Python.

desfrenes

"C'est du json, pas des données en type natif."

Non, il s'agit bien de la représentation littérale en Python de la
réponse (c'est un dictionnaire). Pour preuve, 'error':None où None est un
type Python, pas JSON (en JSON c'est null).

Normalement _call ne doit pas être appelée directement, il vaut mieux
utiliser le nom de la méthode:

result = service.getstring()

Ce qui permet d'avoir directement 'logged in!' dans la variable result.

Alexei Vinidiktov

Oui, vous avez raison. Je me suis trompé a propos du json.

La version que j'avait essayée la première était celle qu'on peut
trouver ici:

http://www.desfrenes.com/python-json-rpc

Et il y avait un exemple qui montrait qu'il fallait appeler la méthode
call ou _call.

result = service._call('hello',{'name':'John Doe'})
service.call('hello',{'name':'John Doe'},onResult,onError)

Apparemment c'était une version un peu ancienne.

Peut-être qu'il faut la metter à jour?

Si j'utilize la version hébergée sur googlecode, tout marche bien.

desfrenes

Yes, I've updated the page.

Comment this