Hoe kan ik een WSDL (SOAP) -webservice in Python consumeren?

Ik wil een WSDL SOAP-gebaseerde webservice in Python gebruiken. Ik heb de duiken Code, maar de zielige module werkt niet onder Python 2.5.

Ik heb geprobeerd zeepprogramma’s die gedeeltelijk werkt, maar breekt met bepaalde typen (SUDS.TYPENOTFOUND: Type niet gevonden : ‘item’).

Ik heb ook gekeken naar client maar dit lijkt niet te ondersteunen WSDL.

en ik heb gekeken naar zsi , maar het ziet er erg complex uit. Heeft iemand er een voorbeeldcode voor?

De WSDL is https://ws.pingdom.com/soap/pingdomapi.wsdlen werkt prima met de PHP 5 SOAP-client.


Antwoord 1, Autoriteit 100%

Ik zou aanraden dat je een kijkje hebt op SUD’s

“SUD’s is een lichtgewicht zeep Python-client voor het consumeren van webservices.”


Antwoord 2, Autoriteit 61%

Er is een relatief nieuwe bibliotheek die veelbelovend is en hoewel nog steeds slecht gedocumenteerd, lijkt erg schoon en pythonic: Python Zeep .

Zie ook dit antwoord voor een voorbeeld.


Antwoord 3, Autoriteit 39%

Ik struikelde onlangs op hetzelfde probleem. Hier is de synopsis van mijn oplossing:

Basic Contactuent Codeblokken Nodig

Hieronder volgen de vereiste basiscodeblokken van uw clienttoepassing

  1. SESSIE AANVRAAG SECTIE: Vraag een sessie bij met de provider
  2. Session Authentication Section: Geef inloggegevens aan de provider
  3. Client-sectie: Maak de klant
  4. Security header sectie: voeg de WS-beveiligingskop aan de klant toe
  5. Consumptie-sectie: consumeer de beschikbare bewerkingen (of methoden) indien nodig

Welke modules heb je nodig?

Velen suggereerden om Python-modules zoals Ulllib2 te gebruiken; Geen van de modules werken – tenminste voor dit specifieke project.

Dus, hier is de lijst met de modules die u moet krijgen.
Allereerst moet u de nieuwste versie van SUD’s downloaden en installeren van de volgende link:

PYPI.PYTHON.org/PYPI/SUDS-JURKO/0.4.1.JURKO.2

Bovendien moet u respectievelijk de aanvragen en SUDS_REQUESTS-modules downloaden en installeren (Disclaimer: Ik ben nieuw om hier te posten, dus ik kan niet meer dan één link voor nu plaatsen).

PYPI.PYTHON.ORD/PYPI/REQUESTS

PYPI.PYTHON.ORG/PYPI/SUDS_REQUESTS/0.1

Zodra u deze modules met succes hebt gedownload en installeert, bent u goed om te gaan.

de code

Volgens de eerder geschetste stappen ziet de code eruit als het volgende:
Invoer:

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

Sessieaanvraag en -authenticatie:

username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)

Maak de client aan:

client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))

WS-beveiligingskop toevoegen:

...
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)

Houd er rekening mee dat deze methode de beveiligingsheader maakt die wordt weergegeven in Fig.1. Uw implementatie kan dus variëren, afhankelijk van het juiste formaat van de beveiligingsheader dat wordt geleverd door de eigenaar van de service die u gebruikt.

Consumeer de relevante methode (of bewerking):

result=client.service.methodName(Inputs)

Logboekregistratie:

Een van de beste praktijken bij dergelijke implementaties is het loggen om te zien hoe de communicatie wordt uitgevoerd. In het geval dat er een probleem is, maakt het debuggen gemakkelijk. De volgende code voert de basisregistratie uit. U kunt echter veel aspecten van de communicatie loggen naast de aspecten die in de code worden weergegeven.

logging.basicConfig(level=logging.INFO) 
logging.getLogger('suds.client').setLevel(logging.DEBUG) 
logging.getLogger('suds.transport').setLevel(logging.DEBUG)

Resultaat:

Hier is het resultaat in mijn geval. Merk op dat de server HTTP 200 retourneerde. Dit is de standaard succescode voor HTTP-verzoek-antwoord.

(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
      },
 })

Antwoord 4, autoriteit 20%

Zeep is een degelijke SOAP-bibliotheek voor Python die overeenkomt met wat je vraagt: http://docs.python -zeep.org


Antwoord 5, autoriteit 14%

Op dit moment (vanaf 2008) zijn alle SOAP-bibliotheken die beschikbaar zijn voor Python waardeloos. Ik raad aan om indien mogelijk SOAP te vermijden. De laatste keer dat we gedwongen waren om een ​​SOAP-webservice van Python te gebruiken, schreven we een wrapper in C# die de SOAP aan de ene kant afhandelde en COM aan de andere kant uitsprak.


Antwoord 6, autoriteit 12%

Ik zoek hier regelmatig naar een bevredigend antwoord, maar tot nu toe geen geluk. Ik gebruik soapUI + verzoeken + handarbeid.

Ik gaf het op en gebruikte Java de laatste keer dat ik nodigom dit te doen, en gaf het gewoon een paar keer op de laatste keer dat ik wildeom dit te doen, maar het was niet essentieel.

Na vorig jaar met succes de verzoekenbibliotheek te hebben gebruikt met de RESTful API van Project Place, kwam het bij me op dat ik de SOAP-verzoeken die ik wil verzenden, misschien op een vergelijkbare manier met de hand zou kunnen rollen.

Blijkbaar is dat niet al te moeilijk, maar het istijdrovend en foutgevoelig, vooral als velden een inconsistente naam hebben (degene waar ik momenteel aan werk heeft ‘jobId’, JobId’ en ‘JobID’. Ik gebruik soapUI om de WSDL te laden om het gemakkelijker te maken om eindpunten enz. te extraheren en wat handmatige tests uit te voeren. Tot nu toe heb ik het geluk gehad dat ik niet ben beïnvloed door wijzigingen in een WSDL die ik gebruik.


Antwoord 7, autoriteit 6%

Het is niet waar dat SOAPpy niet werkt met Python 2.5 – het werkt, hoewel het heel eenvoudig en heel erg basaal is. Als je met een meer gecompliceerde webservice wilt praten, is ZSI je enige vriend.

De echt bruikbare demo die ik heb gevonden is op http://www.ebi .ac.uk/Tools/webservices/tutorials/python– dit heeft me echt geholpen te begrijpen hoe ZSI werkt.


Antwoord 8, autoriteit 2%

Als je zelf aan het rollen bent, raad ik je ten zeerste aan om te kijken naar http://effbot .org/zone/element-soap.htm.


Antwoord 9, autoriteit 2%

SOAPpy is nu verouderd, AFAIK, vervangen door ZSL. Het is een betwistbaar punt, omdat ik geen van beide kan laten werken, laat staan ​​compileren, op Python 2.5 of Python 2.6


Antwoord 10, autoriteit 2%

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

Other episodes