Ответ 1
Я знаю, что это старый поток, но он появился в верхней части результатов Google, поэтому я хотел поделиться более актуальным обсуждением Python и SOAP.
Смотрите: http://www.diveintopython.net/soap_web_services/index.html
Я хочу использовать веб-службу 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.
Я знаю, что это старый поток, но он появился в верхней части результатов Google, поэтому я хотел поделиться более актуальным обсуждением Python и SOAP.
Смотрите: http://www.diveintopython.net/soap_web_services/index.html
Я бы порекомендовал вам взглянуть на SUDS
"Suds - легкий клиент SOAP python для использования веб-сервисов".
Недавно я столкнулся с одной и той же проблемой. Вот краткий обзор моего решения:
Необходимы основные составляющие кодовые блоки
Ниже перечислены необходимые базовые кодовые блоки вашего клиентского приложения.
Какие модули вам нужны?
Многие предложили использовать модули 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
},
})
Существует относительно новая библиотека, которая очень многообещающая и хотя и плохо документированная, кажется очень чистой и pythonic: python zeep.
См. также этот ответ для примера.
Прямо сейчас (с 2008 года) все библиотеки SOAP, доступные для Python, сосут. Я рекомендую избегать SOAP, если это возможно. В прошлый раз, когда мы заставляли использовать веб-службу SOAP с Python, мы написали обертку на С#, которая обрабатывала SOAP с одной стороны и говорила с COM другим.
Я периодически искал удовлетворительный ответ на этот вопрос, но пока не повезло. Я использую soapUI + запросы + ручной труд.
Я сдался и использовал Java в последний раз, когда мне нужно было это сделать, и просто отказался от нескольких раз в последний раз, когда захотел сделать это, но это не было важно.
После успешного использования библиотеки запросов в прошлом году с API-интерфейсом Project Place RESTful мне пришло в голову, что, возможно, я мог бы просто передать запросы SOAP, которые я хочу отправить аналогичным образом.
Оказывается, что это не слишком сложно, но это требует много времени и подвержено ошибкам, особенно если поля непоследовательно названы (тот, с которым я сейчас работаю сегодня, имеет "jobId", JobId "и" JobID ". soapUI для загрузки WSDL, чтобы упростить извлечение конечных точек и т.д. и выполнить ручное тестирование. До сих пор мне повезло, что меня не затронули изменения в любом WSDL, который я использую.
Это не так. SOAPpy не работает с Python 2.5 - он работает, хотя он очень простой и действительно, действительно базовый. Если вы хотите поговорить с более сложным веб-сервисом, ZSI - ваш единственный друг.
Действительно полезная демонстрация, которую я нашел, находится на http://www.ebi.ac.uk/Tools/webservices/tutorials/python - это действительно помогло мне понять, как работает ZSI.
Zeep - достойная SOAP-библиотека для Python, которая соответствует тому, что вы просите: http://docs.python-zeep.org
Если вы катаетесь самостоятельно, я настоятельно рекомендую посмотреть 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']))