Изменить заголовки SOAP с помощью Zeep - PullRequest
1 голос
/ 19 апреля 2019

Я хотел бы установить соединение Soap под python 3 с Zeep (https://python -zeep.readthedocs.io / en / master / index.html ). Но я не понимаю, как изменить заголовки и тело XML !!

Я хочу иметь:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www...." xmlns:ns2="http://schemas....">
    <SOAP-ENV:Header>
        <ns2:UsernameToken>
            <Username>__USERNAME__</Username>
            <Password>__PASSWORD__</Password>
            <Reference>__REFERENCE__</Reference>
        </ns2:UsernameToken>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <ns1:requestAd/>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Я сделал:

"""Doc Placeholder."""

from zeep import Client
from zeep import Settings
from zeep.xsd import ComplexType
from zeep.xsd import Element
from zeep.xsd import String as xString

settings = Settings(strict=False,
                    xml_huge_tree=True,
                    extra_http_headers={'http://www....', 'http://schemas...'})
wsdl = 'https://.......?wsdl'
client = Client(wsdl=wsdl, settings=settings)

header = Element('UsernameToken', ComplexType([Element('Username', xString()),
                                              Element('Password', xString()),
                                              Element('Reference', xString()),
                                               ]))
header_value = header(UsernameToken={'Username': '__USERNAME__',
                                     'Password': '__PASSWORD__',
                                     'Reference': '__REFERENCE__'})

Моя ошибка:

TypeError: ComplexType() got an unexpected keyword argument 'UsernameToken'. 
Signature: `Username: xsd:string, Password: xsd:string, Reference: xsd:string`

Примечания: Я перепробовал все решения в документации , но ничего не работает.

1 Ответ

1 голос
/ 25 июня 2019

Когда я столкнулся с той же проблемой с Zeep, я использовал метод get_type() для вложения данных в мыльный вызов.

"""index.py"""

import zeep

settings = zeep.Settings(strict=False,
                         xml_huge_tree=True,
                         extra_http_headers={'http://www....',
                                             'http://schemas...'})
wsdl = 'https://.......?wsdl'
client = zeep.Client(wsdl=wsdl, settings=settings)
usernameTokenRef = client.get_type('ns2:UsernameToken')
usernameTokenValues = usernameTokenRef(Username='__USERNAME__',
                                       Password='__PASSWORD__',
                                       Reference='__REFERENCE__')

# pass args for UsernameToken into header of soap call
# using _soapheaders arg when calling a service
response = client.service.SomeService(_soapheaders={'UsernameToken':
                                      usernameTokenValues})
...