Python et les Web Services ========================== Les web service permettent un découplage entre les données et leurs utilisations. Ainsi un client peut être en python et le server qui distribue le web service en java. Un peu de vocabulaire **Web Service** : typiquement, c'est un programme informatique capable de recevoir/transmettre des données entre des applications et systèmes hétérogènes (oui, wikipedia m'a aidé). Pour faire simple et vulgaire, c'est une application qui peut fonctionner à peu près partout et n'importe comment. Exemple : on peut utiliser un web service comme une bibliothèque partagée via réseau intranet/Internet par des programmes écrits dans différents langages. **SOAP** : Protocole RPC (Remote Procedure Call), basé sur XML, utilisé pour appeler et retourner le résultat d'une fonction distante. **WSDL (Web Service Description Language)**: Format XML servant à décrire un web service. En effet, pour pouvoir utiliser un web service, il nous faut connaître sa structure : le nom des fonctions, les paramètres, etc... C'est à ça que sert la description WSDL. Il existe comme souvent en python un module qui gère ce genre de problématique: **soappy**. son installation .. code-block:: bash pip install soappy son utilisation: on va faire un serveur et un client soap server.py .. code-block:: python import SOAPpy def hello(): return "Hello World" def msg(txt): return "Your message is %s " % txt server = SOAPpy.SOAPServer(("localhost", 8085)) server.registerFunction(hello) server.registerFunction(msg) server.serve_forever() client.py .. code-block:: python import SOAPpy server = SOAPpy.SOAPProxy("http://localhost:8085/") print server.hello() print server.msg('coucou') .. note:: Pour voir les trames transmises et reçues on ajoute :: server.config.debug = 1 vous lancez maintenant le serveur puis le client: et voilà tout le monde communique son installation .. code-block:: bash python server.py & python client.py On peut écrire un client rapide pour é=essayer le serveur (on utilise un message xml directement dans l'appli) .. code-block:: python # post xml soap message import sys, httplib # a "as lighter as possible" soap message: SoapMessage= """ 85500 """ #construct and send the header webservice = httplib.HTTP("127.0.0.1:8085") webservice.putrequest("POST", "/") webservice.putheader("Host", "127.0.0.1:8085") webservice.putheader("User-Agent", "Python post") webservice.putheader("Content-type", "text/xml; charset=\"UTF-8\"") webservice.putheader("Content-length", "%d" % len(SoapMessage)) webservice.putheader("SOAPAction", "\"\"") webservice.endheaders() webservice.send(SoapMessage) # get the response statuscode, statusmessage, header = webservice.getreply() print "Response: ", statuscode, statusmessage print "headers: ", header res = webservice.getfile().read() print res On peut utiliser le module **soappy** pour faire de l'instrospection de web service .. code-block:: python from SOAPpy import WSDL wsdlFile = 'http://www.xmethods.net/sd/2001/TemperatureService.wsdl' server = WSDL.Proxy(wsdlFile) print server.methods.keys() callInfo = server.methods['getTemp'] print callInfo.inparams print callInfo.inparams[0].name print callInfo.inparams[0].type # on utilise le web service print server.getTemp('90210') .. note:: le module soappy ne permet pas la génération automatique du fichier wsdl, il faut don l'écrire à la main pour le rendre disponible. exemple de fichier wsdl .. code-block:: xml Returns current temperature in a given U.S. zipcode