Niedawno natknąłem się na ten sam problem. Oto streszczenie mojego rozwiązania:
Potrzebne są podstawowe bloki kodu składowego
Poniżej przedstawiono wymagane podstawowe bloki kodu aplikacji klienckiej
- Sekcja żądania sesji: poproś o sesję u dostawcy
- Sekcja uwierzytelniania sesji: podaj poświadczenia dostawcy
- Sekcja klienta: utwórz klienta
- Sekcja Security Header: dodaj nagłówek WS-Security do klienta
- Sekcja dotycząca zużycia: w razie potrzeby wykorzystaj dostępne operacje (lub metody)
Jakie moduły potrzebujesz?
Wielu sugerowało użycie modułów Pythona, takich jak urllib2; jednak żaden z modułów nie działa - przynajmniej dla tego konkretnego projektu.
Oto lista modułów, które musisz zdobyć. Przede wszystkim musisz pobrać i zainstalować najnowszą wersję suds z poniższego linku:
pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2
Dodatkowo musisz pobrać i zainstalować moduły żądań i suds_requests odpowiednio z poniższych linków (zastrzeżenie: jestem nowy, aby pisać tutaj, więc na razie nie mogę opublikować więcej niż jednego linku).
pypi.python.org/pypi/requests
pypi.python.org/pypi/suds_requests/0.1
Po pomyślnym pobraniu i zainstalowaniu tych modułów możesz zaczynać.
Kod
Wykonując kroki opisane wcześniej, kod wygląda następująco: Importy:
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
Żądanie sesji i uwierzytelnianie:
username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)
Utwórz klienta:
client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))
Dodaj nagłówek WS-Security:
...
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)
Należy pamiętać, że ta metoda tworzy nagłówek bezpieczeństwa przedstawiony na rysunku 1. Dlatego implementacja może się różnić w zależności od poprawnego formatu nagłówka zabezpieczeń dostarczonego przez właściciela używanej usługi.
Zużyj odpowiednią metodę (lub operację):
result=client.service.methodName(Inputs)
Rejestrowanie :
Jedną z najlepszych praktyk w takich implementacjach jak ta jest rejestrowanie w celu sprawdzenia, jak przebiega komunikacja. W przypadku wystąpienia problemu ułatwia debugowanie. Poniższy kod wykonuje podstawowe logowanie. Możesz jednak rejestrować wiele innych aspektów komunikacji oprócz tych przedstawionych w kodzie.
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
Wynik:
Oto wynik w moim przypadku. Zauważ, że serwer zwrócił HTTP 200. Jest to standardowy kod sukcesu dla odpowiedzi żądanie-odpowiedź HTTP.
(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
},
})