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)