Ist es möglich, die Python- requests
Bibliothek zum Senden einer SOAP-Anfrage zu verwenden?
python
soap
python-requests
Deepankar Bajpeyi
quelle
quelle
requests.Session
an zeep übergeben .Antworten:
Es ist in der Tat möglich.
Hier ist ein Beispiel für den Aufruf des Wetter-SOAP-Dienstes mit einfachen Anforderungen 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
Einige Notizen:
application/soap+xml
ist wahrscheinlich der korrektere Header (aber der Wetterdienst bevorzugttext/xml
Zum Beispiel:
from jinja2 import Environment, PackageLoader env = Environment(loader=PackageLoader('myapp', 'templates')) template = env.get_template('soaprequests/WeatherSericeRequest.xml') body = template.render()
Einige Leute haben die Schaumbibliothek erwähnt. Suds ist wahrscheinlich die korrektere Art, mit SOAP zu interagieren, aber ich finde oft, dass es ein wenig in Panik gerät, wenn Sie schlecht geformte WDSLs haben (was, TBH, mehr als wahrscheinlich ist, wenn Sie mit einer Institution zu tun haben, die es noch gibt verwendet SOAP;)).
Sie können das oben genannte mit Schaum wie folgt tun:
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
Hinweis: Wenn Sie Schaum verwenden, müssen Sie fast immer den Arzt aufsuchen !
Zum Schluss noch ein kleiner Bonus für das Debuggen von SOAP; TCPdump ist dein Freund. Auf einem Mac können Sie TCPdump folgendermaßen ausführen:
sudo tcpdump -As 0
Dies kann hilfreich sein, um die Anforderungen zu überprüfen, die tatsächlich über das Kabel gehen.
Die beiden oben genannten Codefragmente sind auch als Zusammenfassung verfügbar:
quelle