Как я могу использовать веб-службу 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 для использования веб-сервисов."
недавно я наткнулся на ту же проблему. Вот краткое изложение моего решения:
основные составляющие блоки кода необходимы
ниже приведены необходимые основные блоки кода вашего клиентского приложения
- раздел запроса сеанса: запрос сеанса с поставщиком
- раздел аутентификации сеанса: предоставьте учетные данные поставщику
- раздел клиента: создание клиента
- раздел заголовка безопасности: добавьте заголовок WS-Security в клиент
- раздел потребления: потребляйте доступные операции (или методы) по мере необходимости
какие модули вам нужны?
многие предложили использовать модули 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']))