Suds обрабатывает заголовки иначе, чем Zeep?
У меня есть сценарий Python, использующий suds, который используется для подключения к службе SOAP в HPNA. Скрипт содержит:
import os
from urllib import parse
from urllib.request import pathname2url
from suds.client import Client
from suds.transport.http import HttpAuthenticated
sessionID = None
client = None
def initiate_conn(hostUrl, username, password):
global sessionID
global client
host = hostUrl+'/soap'
wsdl_file = parse.urljoin('file:', pathname2url(os.path.abspath("soap_bindings/hpna10_11_api.wsdl.soappy")))
t = HttpAuthenticated(username=username, password=password)
client = Client(wsdl_file, transport=t)
client.set_options(location=host)
request = client.factory.create('loginInputParms')
request.username = username
request.password = password
authObject = client.service.login(request)
sessionID = authObject.Text
Недавно я решил отредактировать этот скрипт (скрипт был предоставлен HP), чтобы он работал с Zeep, но по какой-то причине я продолжаю получать ошибку заголовка всякий раз, когда пытаюсь запустить скрипт Zeep. Существует ли какой-то механизм автоматической обработки заголовков, который использует Suds, которого нет у Zeep? Я просмотрел сценарий suds несколько раз и не нашел ничего, что ссылается на заголовок, но по какой-то причине скрипт zeep просто выдает ошибки, говорящие об отсутствии заголовка.
Скрипт Zeep можно найти здесь:
#!/usr/bin/python3
import os
from zeep import Client
from zeep.transports import Transport
from zeep.wsse.username import UsernameToken
sessionID = None
client = None
global sessionID
global client
client = Client('hpna10_11_api.wsdl', wsse=UsernameToken('username', 'password'))
service = client.create_service('{http://hp.com/nas/10/10}NetworkManagementApiBinding', 'http://xxx.xxx.xxx.xxx/soap')
factory = client.type_factory('ns0')
creds = factory.loginInputParms(username = 'username', password = 'password')
service.login(creds)
Ошибка, которую я продолжаю получать, может быть найдена здесь:
./test2.py:8: SyntaxWarning: name 'sessionID' is assigned to before global declaration
global sessionID
./test2.py:9: SyntaxWarning: name 'client' is assigned to before global declaration
global client
Traceback (most recent call last):
File "./test2.py", line 15, in <module>
service.login(creds)
File "/usr/local/lib/python3.5/dist-packages/zeep/client.py", line 41, in __call__
self._op_name, args, kwargs)
File "/usr/local/lib/python3.5/dist-packages/zeep/wsdl/bindings/soap.py", line 110, in send
options=options)
File "/usr/local/lib/python3.5/dist-packages/zeep/wsdl/bindings/soap.py", line 68, in _create
serialized = operation_obj.create(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/zeep/wsdl/definitions.py", line 197, in create
return self.input.serialize(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/zeep/wsdl/messages/soap.py", line 64, in serialize
self.body.render(body, body_value)
File "/usr/local/lib/python3.5/dist-packages/zeep/xsd/elements/element.py", line 191, in render
self._render_value_item(parent, value, render_path)
File "/usr/local/lib/python3.5/dist-packages/zeep/xsd/elements/element.py", line 215, in _render_value_item
return self.type.render(node, value, None, render_path)
File "/usr/local/lib/python3.5/dist-packages/zeep/xsd/types/complex.py", line 253, in render
element.render(parent, element_value, child_path)
File "/usr/local/lib/python3.5/dist-packages/zeep/xsd/elements/indicators.py", line 241, in render
element.render(parent, element_value, child_path)
File "/usr/local/lib/python3.5/dist-packages/zeep/xsd/elements/element.py", line 185, in render
self.validate(value, render_path)
File "/usr/local/lib/python3.5/dist-packages/zeep/xsd/elements/element.py", line 236, in validate
"Missing element %s" % (self.name), path=render_path)
zeep.exceptions.ValidationError: Missing element RequestHeader (login.RequestHeader)
А сам WSDL можно найти здесь: https://drive.google.com/file/d/1VpLVwF-AMV4zDtZQClh5G2Mn0ZWwCB_n/view?usp=sharing
Спасибо за вашу помощь с этим