3

我刚开始使用其中一个 DHL-SOAP API 并使用 zeep 对 API 运行请求。API 期望和元素验证是这样的:

...
<soapenv:Header>
    <cis:Authentification>
        <cis:user>USER</cis:user>
        <cis:signature>PASSWORD</cis:signature>
    </cis:Authentification>
</soapenv:Header>
...

我尝试将身份验证作为 _soapheaders 的一部分传递,如 zeep 文档中所述,dict 表示法和 xsd.Element 表示法似乎都不起作用。

from zeep import Client
from zeep import xsd

client = Client('<URL_TO_WSDL>')
auth_header = {'user': 'user', 'signature': 'signature'}
# dict approach
client.service.DHL_SERVICE(_soapheaders={'Authentification': auth_header})

# xsd approach
header = xsd.Element('Authentification',
    xsd.ComplexType([
        xsd.Element('user', xsd.String()),
        xsd.Element('signature', xsd.String())
    ])
)
header_values = header(user='user', signature='signature')
client.service.DHL_SERVICE(_soapheaders=[header_values])

我在 DHL 文档中没有在 zeep 文档中找到有用的信息。

先感谢您!

问候

4

1 回答 1

1

以防万一有人遇到同样的问题。事实证明,客户端需要在网关上使用 HTTPBasicAuth 进行身份验证。此外,必须使用带有会话的传输来创建客户端,并携带网关身份验证标头。使 xsd API 标头方法起作用的原因是添加了{http://test.python-zeep.org}. 此设置使与 API 的通信顺利进行。

from requests import Session
from requests.auth import HTTPBasicAuth
from zeep import Client
from zeep.transports import Transport

session = Session()

# Authenticate  with gateway
session.auth = HTTPBasicAuth(user, password)
client = Client(WSDL_PATH, transport=Transport(session=session))

# Build Authentification header for API-Endpoint using zeep xsd
header = xsd.Element(
    '{http://test.python-zeep.org}Authentification',
    xsd.ComplexType([
        xsd.Element(
            '{http://test.python-zeep.org}user',
            xsd.String()),
        xsd.Element(
            '{http://test.python-zeep.org}signature',
            xsd.String()),
    ])
)
header_value = header(user=USER, signature=PASSWORD)
client.service.DHL_SERVICE(_soapheaders=[header_value])

于 2020-02-18T23:36:43.103 回答