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