Ich bin kürzlich auf das gleiche Problem gestoßen. Hier ist die Zusammenfassung meiner Lösung:
Grundlegende Codeblöcke werden benötigt
Im Folgenden sind die erforderlichen grundlegenden Codeblöcke Ihrer Clientanwendung aufgeführt
- Sitzungsanforderungsabschnitt: Fordern Sie eine Sitzung mit dem Anbieter an
- Abschnitt zur Sitzungsauthentifizierung: Geben Sie dem Anbieter Anmeldeinformationen an
- Client-Bereich: Erstellen Sie den Client
- Abschnitt "Sicherheitskopf": Fügen Sie dem Client den WS-Sicherheitskopf hinzu
- Verbrauchsabschnitt: Verbrauchen Sie verfügbare Vorgänge (oder Methoden) nach Bedarf
Welche Module benötigen Sie?
Viele schlugen vor, Python-Module wie urllib2 zu verwenden. Keines der Module funktioniert jedoch - zumindest für dieses spezielle Projekt.
Hier ist die Liste der Module, die Sie benötigen. Zunächst müssen Sie die neueste Version von Schaum über den folgenden Link herunterladen und installieren:
pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2
Darüber hinaus müssen Sie Anforderungs- und suds_requests-Module von den folgenden Links herunterladen und installieren (Haftungsausschluss: Ich bin neu hier, daher kann ich vorerst nicht mehr als einen Link veröffentlichen).
pypi.python.org/pypi/requests
pypi.python.org/pypi/suds_requests/0.1
Sobald Sie diese Module erfolgreich heruntergeladen und installiert haben, können Sie loslegen.
Der Code
Nach den zuvor beschriebenen Schritten sieht der Code folgendermaßen aus: Importe:
import logging
from suds.client import Client
from suds.wsse import *
from datetime import timedelta,date,datetime,tzinfo
import requests
from requests.auth import HTTPBasicAuth
import suds_requests
Sitzungsanforderung und Authentifizierung:
username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)
Erstellen Sie den Client:
client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))
WS-Sicherheitskopf hinzufügen:
...
addSecurityHeader(client,username,password)
....
def addSecurityHeader(client,username,password):
security=Security()
userNameToken=UsernameToken(username,password)
timeStampToken=Timestamp(validity=600)
security.tokens.append(userNameToken)
security.tokens.append(timeStampToken)
client.set_options(wsse=security)
Bitte beachten Sie, dass diese Methode den in Abb.1 dargestellten Sicherheitsheader erstellt. Daher kann Ihre Implementierung abhängig vom richtigen Sicherheitsheaderformat variieren, das vom Eigentümer des von Ihnen genutzten Dienstes bereitgestellt wird.
Verbrauchen Sie die relevante Methode (oder Operation):
result=client.service.methodName(Inputs)
Protokollierung :
Eine der besten Methoden bei solchen Implementierungen wie dieser ist die Protokollierung, um zu sehen, wie die Kommunikation ausgeführt wird. Falls es ein Problem gibt, erleichtert es das Debuggen. Der folgende Code führt die grundlegende Protokollierung durch. Sie können jedoch zusätzlich zu den im Code dargestellten Aspekten viele Aspekte der Kommunikation protokollieren.
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
Ergebnis:
Hier ist das Ergebnis in meinem Fall. Beachten Sie, dass der Server HTTP 200 zurückgegeben hat. Dies ist der Standard-Erfolgscode für die HTTP-Anforderungsantwort.
(200, (collectionNodeLmp){
timestamp = 2014-12-03 00:00:00-05:00
nodeLmp[] =
(nodeLmp){
pnodeId = 35010357
name = "YADKIN"
mccValue = -0.19
mlcValue = -0.13
price = 36.46
type = "500 KV"
timestamp = 2014-12-03 01:00:00-05:00
errorCodeId = 0
},
(nodeLmp){
pnodeId = 33138769
name = "ZION 1"
mccValue = -0.18
mlcValue = -1.86
price = 34.75
type = "Aggregate"
timestamp = 2014-12-03 01:00:00-05:00
errorCodeId = 0
},
})