Senden einer SOAP-Anfrage mit Python-Anfragen

77

Ist es möglich, die Python- requestsBibliothek zum Senden einer SOAP-Anfrage zu verwenden?

Deepankar Bajpeyi
quelle
Wie ist diese Lösung? stackoverflow.com/q/15569330/2620328
sihrc
soll keinen Schaum verwenden;
Deepankar Bajpeyi
@DeepankarBajpeyi warum nicht? Es ist das einzige Werkzeug, das für diesen Job geeignet ist.
Ian Stapleton Cordasco
1
Sie können a requests.Sessionan zeep übergeben .
OrangeDog
@ IanStapletonCordasco war auch 2013 Schaum tot.
OrangeDog

Antworten:

156

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:

  • Die Überschriften sind wichtig. Die meisten SOAP-Anforderungen funktionieren ohne die richtigen Header nicht. application/soap+xmlist wahrscheinlich der korrektere Header (aber der Wetterdienst bevorzugttext/xml
  • Dadurch wird die Antwort als XML-Zeichenfolge zurückgegeben. Anschließend müssen Sie diese XML-Datei analysieren.
  • Der Einfachheit halber habe ich die Anfrage als Klartext eingefügt. Die beste Vorgehensweise wäre jedoch, dies als Vorlage zu speichern. Anschließend können Sie es beispielsweise mit jinja2 laden und Variablen übergeben.

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:

toast38coza
quelle
2
Was ist, wenn der Dienst Benutzername und Passwort anfordert? wo man sie notiert?
Oskars
Das Suds-Code-Snippet gibt jetzt "suds.transport.TransportError: HTTP-Fehler 500: Interner Serverfehler" aus. Scheint, als wäre der Server geschlossen.
Louis
3
@ toast38coza wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL -> Serverfehler in der Anwendung '/ WeatherWS'. Bitte aktualisieren Sie das Beispiel.
Wlad
1
@ toast38coza Woher bekomme ich Informationen zu Headern und Body-Variablen im obigen Anforderungsbeispiel?
Wlad
Die Suds-Dokumentation ist auf fedorahosted.org nicht mehr verfügbar. Hier ist ein Link zu einer Momentaufnahme der Dokumentation auf der Wayback-Maschine.
Christian Long