Аутентификация по DHL- SOAP API с Zeep - PullRequest
2 голосов
/ 13 февраля 2020

Я только начал работать с одним из API-интерфейсов DHL- SOAP и использую 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. Кажется, что запись элементов работает.

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.

Заранее спасибо!

С уважением

1 Ответ

0 голосов
/ 19 февраля 2020

На тот случай, если кто-то когда-нибудь столкнется с такими же проблемами. Оказалось, что клиент должен пройти аутентификацию на шлюзе с использованием HTTPBasicAuth. Кроме того, клиент должен был быть создан с использованием транспорта с сеансом, содержащим заголовки аутентификации шлюза. То, что сделало подход заголовка API xsd, было добавлением {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])

...