Recentemente mi sono imbattuto nello stesso problema. Ecco la sinossi della mia soluzione:
Blocchi di codice costituenti di base necessari
Di seguito sono riportati i blocchi di codice di base obbligatori dell'applicazione client
- Sezione richiesta sessione: richiedi una sessione con il provider
- Sezione di autenticazione della sessione: fornire le credenziali al provider
- Sezione client: crea il client
- Sezione intestazione sicurezza: aggiungi l'intestazione WS-Security al client
- Sezione Consumo: consuma le operazioni (o metodi) disponibili secondo necessità
Di quali moduli hai bisogno?
Molti hanno suggerito di utilizzare moduli Python come urllib2; tuttavia, nessuno dei moduli funziona, almeno per questo particolare progetto.
Quindi, ecco l'elenco dei moduli che devi ottenere. Prima di tutto, devi scaricare e installare l'ultima versione di suds dal seguente link:
pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2
Inoltre, è necessario scaricare e installare le richieste e i moduli suds_requests rispettivamente dai seguenti link (disclaimer: sono nuovo a postare qui, quindi non posso pubblicare più di un link per ora).
pypi.python.org/pypi/requests
pypi.python.org/pypi/suds_requests/0.1
Dopo aver scaricato e installato con successo questi moduli, sei a posto.
Il codice
Seguendo i passaggi descritti in precedenza, il codice è simile al seguente: Imports:
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
Richiesta di sessione e autenticazione:
username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)
Crea il cliente:
client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))
Aggiungi intestazione 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)
Si noti che questo metodo crea l'intestazione di sicurezza rappresentata in Fig.1. Pertanto, l'implementazione può variare a seconda del formato corretto dell'intestazione di sicurezza fornito dal proprietario del servizio che stai utilizzando.
Consuma il metodo (o l'operazione) pertinente:
result=client.service.methodName(Inputs)
Registrazione :
Una delle migliori pratiche in implementazioni come questa è la registrazione per vedere come viene eseguita la comunicazione. In caso di problemi, semplifica il debug. Il codice seguente esegue la registrazione di base. Tuttavia, è possibile registrare molti aspetti della comunicazione oltre a quelli rappresentati nel codice.
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
Risultato:
Ecco il risultato nel mio caso. Notare che il server ha restituito HTTP 200. Questo è il codice di successo standard per la richiesta-risposta 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
},
})