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

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

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

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

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

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

Ответ 1

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

Смотрите: http://www.diveintopython.net/soap_web_services/index.html

Ответ 2

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

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

Ответ 3

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

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

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

  • Раздел запроса сеанса: запрос сеанса с провайдером
  • Секция проверки сеанса: предоставить учетные данные провайдеру
  • Раздел клиента: создайте клиент
  • Раздел заголовка безопасности: добавьте заголовок WS-Security в Client
  • Раздел потребления: потреблять доступные операции (или методы) по мере необходимости

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

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

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

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 Header:

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

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

Действительно полезная демонстрация, которую я нашел, находится на http://www.ebi.ac.uk/Tools/webservices/tutorials/python - это действительно помогло мне понять, как работает ZSI.

Ответ 8

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

Ответ 10

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

Ответ 11

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