example desde consumir conectarse python web-services soap

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

  1. Sección de solicitud de sesión: solicite una sesión con el proveedor
  2. Sección de autenticación de sesión: proporcionar credenciales al proveedor
  3. Sección del cliente: crear el cliente
  4. Sección del encabezado de seguridad: agregue el encabezado WS-Security al cliente
  5. 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 }, })



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



Yo recomendaría que eche un vistazo a SUDS

"Suds es un cliente liviano de python SOAP para consumir servicios web".



#!/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'']))