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