Aller au contenu

Un client SOAP en Python avec Suds

·248 mots·2 mins
Auteur
My name
A little bit about me

La manière la plus simple que j’ai trouvée pour contacter un serveur SOAP (WCF) avec un client Python, est de passer par Suds. Après avoir contacté le serveur, cette librairie construit dynamiquement les différentes méthodes directement sur le service client. Si par exemple le service sur le serveur expose les méthodes RunQuery et Execute, vous pourrez directement les invoquer via client.service.RunQuery et client.service.Execute.

Attention que la version officielle n’est compatible qu’avec Python2. Pour une compatibilité avec Python3, il existe suds-py3. Les deux sont disponibles sur Pypi, et installable avec pip.

La seule difficulté a été de construire les paramètres. Comme les paramètres XML peuvent être beaucoup plus complexes que les paramètres en JSON (ie. string, number, object, array, bool ou nul), il vous faudra construire ces paramètres en passant par une factory:

from suds.client import Client

wsdl = 'http://localhost:88/WebService.svc?wsdl'

client = Client(wsdl)
print(client)

Suds ( https://fedorahosted.org/suds/ )  version: 1.3.2.0 IN  build: 20160428

Service ( HAWWebService )
    tns="http://tempuri.org/"
    Prefixes (4)
        ns0 = "http://schemas.datacontract.org/2004/07/SplendidFactory.Requests"

        Ports (1):
            (BasicHttpBinding_IHAWWebService)
                Methods (1):
                    RunQuery(ns0:RequestRunQuery request,)
            Types (7):
                ns0:RequestBase
                ns0:RequestRunQuery
                ns0:ResponseBase
                ns0:ResponseRunQuery
                ns0:char
                ns0:duration
                ns0:guid

Dans l’exemple ci-dessus, on voit qu’il y a une méthode RunQuery, qui prend un paramètre de type ns0:RequestRunQuery (ou, plus précisément, un paramètre de type http://schemas.datacontract.org/2004/07/SplendidFactory.Requests.RequestRunQuery. Pour instancier cet objet, il y a deux manières de faire, la seconde étant sans doute préférable:

param1 = client.factory.create('ns0:RequestRunQuery')
param2 = client.factory.create('{http://schemas.datacontract.org/2004/07/SplendidFactory.Requests}RequestRunQuery')

Après, cela on envoie les paramètres correctement construits dans la méthode d’appel, et on récupère le résultat:

response = client.service.RunQuery(param2)
print(response)