Mise à jour du client Python JSON-RPC
25 oct. 2009 11:31:50
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:
- utilisation de __getattr__ : pour faire simple, permet de simuler la présence des méthodes du service au niveau du proxy, un peu comme avec la méthode magique __call sous PHP,
- authentification HTTP basique: on peut désormais passer un utilisateur et un mot de passe dans le constructeur du proxy, ils seront ensuite envoyés dans les entêtes,
- suppression du hack correctif pour le Framework Zend, puisqu'il n'a plus de raison d'être.
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é.
Comments:
Alexei Vinidiktov (7 avr. 2010 17:18:02)
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
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 (8 avr. 2010 03:46:31)
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 (8 avr. 2010 03:54:52)
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
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 (8 avr. 2010 10:17:08)
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