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