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.

Votre commentaire