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



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



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



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



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



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

1341   11  

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

кроме того, вам нужно загрузить и установить модули requests и 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#, которая обрабатывала мыло с одной стороны и говорила COM с другой.

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

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

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

оказывается, это не слишком сложно, но это - это отнимает много времени и подвержен ошибкам, особенно если поля имеют несогласованные имена (тот, над которым я сейчас работаю, имеет "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 - это действительно помогло мне понять, как работает ZSI.

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

SOAPpy является теперь устаревшим, насколько мне известно, заменить ЗСЛ. Это спорный вопрос, потому что я не могу заставить ни один из них работать, а тем более компилировать, ни на 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']))

Comments

    Ничего не найдено.