Est-il possible d'utiliser la bibliothèque requests
de Python pour envoyer une requête SOAP?
C'est effectivement possible.
Voici un exemple appelant le service Météo SOAP avec des requêtes simples, lib:
import requests
url="http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL"
#headers = {'content-type': 'application/soap+xml'}
headers = {'content-type': 'text/xml'}
body = """<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://ws.cdyne.com/WeatherWS/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns1:Body><ns0:GetWeatherInformation/></ns1:Body>
</SOAP-ENV:Envelope>"""
response = requests.post(url,data=body,headers=headers)
print response.content
Quelques notes:
application/soap+xml
est probablement le plus correct en-tête à utiliser (mais le service météorologique préfère text/xml
Par exemple:
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('myapp', 'templates'))
template = env.get_template('soaprequests/WeatherSericeRequest.xml')
body = template.render()
Certaines personnes ont mentionné la bibliothèque de mousse. Suds est probablement le plus correct moyen d’interagir avec SOAP, mais je trouve souvent que cela panique un peu lorsque vous avez des WDSL mal formés (qui, TBH, est plus probable qu’improbable quand vous traitez avec une institution qui utilise toujours SOAP;)).
Vous pouvez faire ce qui précède avec de la mousse comme ceci:
from suds.client import Client
url="http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL"
client = Client(url)
print client ## shows the details of this service
result = client.service.GetWeatherInformation()
print result
Remarque: Lorsque vous utilisez de la mousse, vous finirez presque toujours par avoir besoin de consultez votre médecin !
Enfin, un petit bonus pour le débogage de SOAP; TCPdump est votre ami. Sur Mac, vous pouvez exécuter TCPdump comme ceci:
Sudo tcpdump -As 0
Cela peut être utile pour inspecter les demandes qui passent réellement par le fil.
Les deux extraits de code ci-dessus sont également disponibles sous forme de résumé: