Recientemente me topé con el mismo problema. Aquí está la sinopsis de mi solución:
Se necesitan bloques de código constituyente básicos
Los siguientes son los bloques de código básicos necesarios de su aplicación cliente
- Sección de solicitud de sesión: solicite una sesión con el proveedor
- Sección de autenticación de sesión: proporcionar credenciales al proveedor
- Sección del cliente: crear el cliente
- Sección del encabezado de seguridad: agregue el encabezado WS-Security al cliente
- Sección de consumo: consuma las operaciones disponibles (o métodos) según sea necesario
¿Qué módulos necesitas?
Muchos sugirieron usar módulos de Python como urllib2; sin embargo, ninguno de los módulos funciona, al menos para este proyecto en particular.
Entonces, aquí está la lista de los módulos que necesita obtener. En primer lugar, debe descargar e instalar la última versión de espuma desde el siguiente enlace:
pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2
Además, debe descargar e instalar solicitudes y módulos de suds_requests desde los siguientes enlaces respectivamente (descargo de responsabilidad: soy nuevo para publicar aquí, por lo que no puedo publicar más de un enlace por ahora).
pypi.python.org/pypi/requests
pypi.python.org/pypi/suds_requests/0.1
Una vez que descargue e instale con éxito estos módulos, está listo para comenzar.
El código
Siguiendo los pasos descritos anteriormente, el código tiene el siguiente aspecto: Importaciones:
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
Solicitud de sesión y autenticación:
username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)
Crea el cliente:
client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))
Agregar encabezado 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)
Tenga en cuenta que este método crea el encabezado de seguridad representado en la Fig.1. Por lo tanto, su implementación puede variar según el formato de encabezado de seguridad correcto proporcionado por el propietario del servicio que está consumiendo.
Consuma el método (u operación) relevante:
result=client.service.methodName(Inputs)
Registro :
Una de las mejores prácticas en implementaciones como esta es iniciar sesión para ver cómo se ejecuta la comunicación. En caso de que haya algún problema, facilita la depuración. El siguiente código hace un registro básico. Sin embargo, puede registrar muchos aspectos de la comunicación además de los que se muestran en el código.
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
Resultado:
Aquí está el resultado en mi caso. Tenga en cuenta que el servidor devolvió HTTP 200. Este es el código de éxito estándar para la solicitud-respuesta 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
},
})