desde - suds python
¿Cómo puedo consumir un servicio web WSDL(SOAP) en Python? (11)
En este momento (a partir de 2008), todas las bibliotecas SOAP disponibles para Python apestan. Recomiendo evitar SOAP si es posible. La última vez que nos vimos obligados a utilizar un servicio web SOAP de Python, escribimos un contenedor en C # que manejaba el SOAP por un lado y comunicaba COM por el otro.
Quiero usar un servicio web basado en WSDL SOAP en Python. He observado el código de inmersión en Python , pero el módulo de SOAPpy no funciona en Python 2.5.
He intentado usar suds que funciona en parte, pero se rompe con ciertos tipos (espuma. TipoNo sonido: tipo no encontrado: "elemento").
También he consultado al Client pero esto no parece ser compatible con WSDL.
Y miré a ZSI pero parece muy complejo. ¿Alguien tiene un código de muestra para eso?
El WSDL es https://ws.pingdom.com/soap/PingdomAPI.wsdl y funciona bien con el cliente PHP 5 SOAP.
Hay una biblioteca relativamente nueva que es muy prometedora y, aunque todavía está poco documentada, parece muy limpia y pitonica: python zeep .
Ver también esta respuesta para un ejemplo.
No es verdad SOAPpy no funciona con Python 2.5. Funciona, aunque es muy simple y realmente, realmente básico. Si desea hablar con un servicio web más complicado, ZSI es su único amigo.
La demo realmente útil que encontré está en http://www.ebi.ac.uk/Tools/webservices/tutorials/python . Esto realmente me ayudó a entender cómo funciona ZSI.
Periódicamente busco una respuesta satisfactoria a esto, pero hasta ahora no tengo suerte. Uso soapUI + solicitudes + trabajo manual.
Me rendí y utilicé Java la última vez que necesité hacer esto, y simplemente me rendí varias veces la última vez que quise hacer esto, pero no fue esencial.
Después de haber utilizado con éxito la biblioteca de solicitudes el año pasado con RESTful API de Project Place, se me ocurrió que tal vez podría simplemente pasar manualmente las solicitudes SOAP que deseo enviar de una manera similar.
Resulta que no es muy difícil, pero consume mucho tiempo y es propenso a errores, especialmente si los campos tienen nombres desiguales (el que estoy trabajando actualmente tiene ''jobId'', JobId ''y'' JobID ''. Uso soapUI para cargar el WSDL para facilitar la extracción de puntos finales, etc. y realizar algunas pruebas manuales. Hasta ahora he tenido la suerte de no haberme visto afectado por los cambios en ningún WSDL que estoy usando.
Recientemente me encontré con el mismo problema. Aquí está la sinopsis de mi solución:
Se necesitan bloques básicos de código constituyente
Los siguientes son los bloques de código básicos requeridos 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 (o métodos) disponibles 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 del siguiente enlace:
pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2
Además, debe descargar e instalar solicitudes y módulos suds_requests de los siguientes enlaces (descargo de responsabilidad: soy nuevo para publicar aquí, por lo que no puedo publicar más de un enlace por el momento).
pypi.python.org/pypi/requests
pypi.python.org/pypi/suds_requests/0.1
Una vez que haya descargado e instalado con éxito estos módulos, ya está listo.
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)
Crear 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 que se muestra 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.
Consumir el método (u operación) relevante:
result=client.service.methodName(Inputs)
Logging :
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, hace que la depuración sea fácil. El siguiente código hace el 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 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
},
})
Sé que este es un hilo antiguo, pero apareció en la parte superior de los resultados de Google, así que quería compartir una discusión más actual sobre Python y SOAP.
Ver: http://www.diveintopython.net/soap_web_services/index.html
SOAPpy ahora está obsoleto, AFAIK, reemplazado por ZSL. Es un punto discutible, porque no puedo conseguir que ninguno funcione, mucho menos compilar, en Python 2.5 o Python 2.6
Si está renovando el suyo, le recomiendo consultar http://effbot.org/zone/element-soap.htm .
Yo recomendaría que eche un vistazo a SUDS
"Suds es un cliente liviano de python SOAP para consumir servicios web".
Zeep es una biblioteca SOAP decente para Python que coincide con lo que estás pidiendo: http://docs.python-zeep.org
#!/usr/bin/python
# -*- coding: utf-8 -*-
# consume_wsdl_soap_ws_pss.py
import logging.config
from pysimplesoap.client import SoapClient
logging.config.dictConfig({
''version'': 1,
''formatters'': {
''verbose'': {
''format'': ''%(name)s: %(message)s''
}
},
''handlers'': {
''console'': {
''level'': ''DEBUG'',
''class'': ''logging.StreamHandler'',
''formatter'': ''verbose'',
},
},
''loggers'': {
''pysimplesoap.helpers'': {
''level'': ''DEBUG'',
''propagate'': True,
''handlers'': [''console''],
},
}
})
WSDL_URL = ''http://www.webservicex.net/stockquote.asmx?WSDL''
client = SoapClient(wsdl=WSDL_URL, ns="web", trace=True)
client[''AuthHeaderElement''] = {''username'': ''someone'', ''password'': ''nottelling''}
#Discover operations
list_of_services = [service for service in client.services]
print(list_of_services)
#Discover params
method = client.services[''StockQuote'']
response = client.GetQuote(symbol=''GOOG'')
print(''GetQuote: {}''.format(response[''GetQuoteResult'']))