2.9 KiB
Title | Date | Tags |
---|---|---|
Un client SOAP en Python avec Suds | 2016-08-23 | python, soap, suds, wcf |
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/ImagoInboxWebService.Requests"
ns1 = "http://schemas.datacontract.org/2004/07/ImagoInboxWebService.ResponseBase
ns2 = "http://schemas.microsoft.com/2003/10/Serialization/"
ns3 = "http://tempuri.org/"
Ports (1):
(BasicHttpBinding_IHAWWebService)
Methods (1):
RunQuery(ns0:RequestRunQuery request,)
Types (7):
ns0:RequestBase
ns0:RequestRunQuery
ns1:ResponseBase
ns1:ResponseRunQuery
ns2:char
ns2:duration
ns2: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/ImagoInboxWebService.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/ImagoInboxWebService.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)