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