Python, web2py et services en JSON-RPC
7 mai 2009 22:15:51
Je suis encore surpris de voir à quel point web2py rend certaines tâches incroyablement faciles à réaliser. Exemple du jour, comment faire si je veux exposer un service en JSON-RPC depuis web2py ? Pour faire original (hum...), un service "hello world" par exemple.
Dans un controleur:
from gluon.tools import Service # creer une instance du serveur service = Service(globals()) # decorer la fonction a exposer en tant que json-rpc @service.jsonrpc def rpctest(name): return 'hello ' + name # definir une fonction qui servira de point d'entree du service def call(): return service()
Et ensuite... et bien ensuite c'est tout, votre service est prêt à être consommé à l'adresse http://127.0.0.1:8000/appli/controleur/call/jsonrpc :-)
Pour la partie cliente, il existe une librairie qui était disponible sur le site json-rpc.org, mais apparemment le site n'est plus accessible. J'en suis venu à implémenter ma solution, qui a aussi l'avantage de fonctionner aussi avec un service JSON-RPC créé par le Zend Framework (ce dernier n'implémentant pas correctement la spec 1.0):
def onResult(result):
print 'success :-) : ' + str(result)
def onError(error):
print 'failure :-( : ' + error['message']
service = proxy('http://127.0.0.1:8000/appli/controleur/call/jsonrpc');
service.call('rpctest',['John Doe'],onResult,onError)
Le mieux... on peut également exposer une même fonction à travers d'autres protocoles (xmlrpc, amf, etc), simplement en ajoutant d'autres decorateurs à la fonction, comme il est expliqué dans la documentation.