Как я могу использовать веб-службу WSDL (SOAP) в Python?

Я хочу использовать веб-службу на основе WSDL SOAP в Python. Я посмотрел на Погружение В Python код, но модуль SOAPpy не работает под Python 2.5.

Я пробовал использовать магазина который работает частично, но разрывается с определенными типами (suds.TypeNotFound: тип не найден:'item').

Я также посмотрел на клиент но это, похоже, не поддерживает WSDL.

и я посмотрел на ZSI но выглядит очень сложно. У кого-нибудь есть образец кода?

в WSDL-это https://ws.pingdom.com/soap/PingdomAPI.wsdl и прекрасно работает с PHP 5 SOAP-клиента.

11 ответов


Я знаю, что это старый поток, но он появлялся в верхней части результатов Google, поэтому я хотел поделиться более актуальной дискуссией о Python и SOAP.

см.:http://www.diveintopython.net/soap_web_services/index.html


Я бы рекомендовал вам взглянуть на пена

"Suds-это легкий клиент SOAP python для использования веб-сервисов."


недавно я наткнулся на ту же проблему. Вот краткое изложение моего решения:

основные составляющие блоки кода необходимы

ниже приведены необходимые основные блоки кода вашего клиентского приложения

  1. раздел запроса сеанса: запрос сеанса с поставщиком
  2. раздел аутентификации сеанса: предоставьте учетные данные поставщику
  3. раздел клиента: создание клиента
  4. раздел заголовка безопасности: добавьте заголовок WS-Security в клиент
  5. раздел потребления: потребляйте доступные операции (или методы) по мере необходимости

какие модули вам нужны?

многие предложили использовать модули Python, такие как urllib2 ; однако ни один из модулей не работает-по крайней мере, для этого конкретного проекта.

Итак, вот список модулей, которые необходимо получить. Прежде всего, вам необходимо скачать и установите последнюю версию suds по следующей ссылке:

pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2

кроме того, вам нужно загрузить и установить запросы и модули suds_requests из следующих ссылок соответственно ( отказ от ответственности: я новичок в публикации здесь, поэтому я не могу опубликовать более одной ссылки на данный момент).

pypi.python.org/pypi/requests

pypi.python.org/pypi/suds_requests/0.1

после того, как вы успешно скачать и установить эти модули, вы хорошо идти.

код

следуя шагам, описанным выше, код выглядит следующим образом: Импорт:

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

запрос сеанса и аутентификация:

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

создать клиент:

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

добавить заголовок 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)

обратите внимание, что этот метод создает заголовок безопасности, изображенный на рис.1. Таким образом, ваша реализация может варьироваться в зависимости от правильного формата заголовка безопасности, предоставленного владельцем используемой службы.

потребляйте соответствующий метод (или операцию) :

result=client.service.methodName(Inputs)

ведение журнала:

одной из лучших практик в таких реализациях, как эта, является ведение журнала, чтобы увидеть, как выполняется связь. Если есть какая-то проблема, это упрощает отладку. Следующий код выполняет базовое ведение журнала. Тем не менее, вы можете регистрировать многие аспекты связи в дополнение к тем, которые изображены в коде.

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

результат:

вот результат в моем случае. Обратите внимание, что сервер вернул HTTP 200. Это стандартный код успеха для 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
      },
 })

существует относительно новой библиотеки, которая является очень перспективным и пока еще плохо документированы, кажется, очень чистый и данные: python zeep.

см. также ответ для примера.


прямо сейчас (по состоянию на 2008 год) все библиотеки SOAP, доступные для Python, сосут. Я рекомендую избегать мыла, если это возможно. В последний раз, когда мы были вынуждены использовать веб-сервис SOAP от Python, мы написали обертку на C#, которая обрабатывала мыло с одной стороны и говорила с другой.


Я периодически ищу удовлетворительный ответ на это, но пока не повезло. Я использую soapUI + запросы + ручной труд.

Я сдался и использовал Java в последний раз, когда я нужны чтобы сделать это, и просто сдался несколько раз в последний раз я хотел сделать это, но это не было необходимо.

успешно использовав библиотеку запросов в прошлом году с RESTful API Project Place, мне пришло в голову, что, возможно, я мог бы просто вручную свернуть мыло запросы, которые я хочу отправить аналогичным образом.

оказывается, это не слишком сложно, но это is трудоемкий и склонный к ошибкам, особенно если поля непоследовательно названы (тот, над которым я сейчас работаю, имеет "jobId", JobId " и "JobID". Я использую soapUI для загрузки WSDL, чтобы упростить извлечение конечных точек и т. д. и выполнить ручное тестирование. До сих пор мне повезло, что на меня не повлияли изменения в любом WSDL, который я использую.


Zeep-приличная библиотека SOAP для Python, которая соответствует тому, что вы просите:http://docs.python-zeep.org


Это не правда SOAPpy не работает с Python 2.5-он работает, хотя это очень просто и очень, очень просто. Если вы хотите поговорить с более сложным веб-сервисом, ZSI - ваш единственный друг.

действительно полезный пример я нашел в http://www.ebi.ac.uk/Tools/webservices/tutorials/python - это действительно помогло мне понять, как ЗСИ работает.


Если вы катите свой собственный, я настоятельно рекомендую посмотреть наhttp://effbot.org/zone/element-soap.htm.


SOAPpy теперь устарел, AFAIK, заменен ZSL. Это спорный вопрос, потому что я не могу заставить ни один из них работать, а тем более компилироваться, ни на Python 2.5, ни на Python 2.6


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