Python — сложный заголовок Zeep SOAP

Я хотел бы передать заголовок «Сложный» службе SOAP с библиотекой zeep

Вот как это должно выглядеть

 <soapenv:Header>
      <something:myVar1>FOO</something:myVar1>
      <something:myVar2>JAM</something:myVar2>
 </soapenv:Header>

Я предполагаю, что мне удалось отправить заголовок таким образом

header = xsd.Element(
    '{http://urlofthews}Header',
        xsd.ComplexType([
        xsd.Element(
        '{http://urlofthews}myVar1',
        xsd.String()),
        xsd.Element(
        '{http://urlofthews}myVar2',
        xsd.String())
        ])
    )

header_value = header(myVar1='FOO',myVar2='JAM')
print (header_value)
datasoap=client.service.UserRessourcesCatalog(requete,_soapheaders=[header_value])

Но я не понимаю, как объявить и передать пространство имен «что-то» в моем заголовке с помощью XSD.

Любая помощь ?

Спасибо заранее.

Наилучшие пожелания


Как указано в документации

http://docs.python-zeep.org/en/master/headers.html

«Еще один вариант — передать объект элемента lxml. Обычно это полезно, если wsdl не определяет заголовок мыла, но сервер ожидает его».

это мой случай, поэтому я попытался

try:
        import xml.etree.cElementTree as ET
    except ImportError:
        import xml.etree.ElementTree as ET
    ET.register_namespace('something', 'http://urlofthews')

    headerXML = ET.Element("soapenv:Header")
    var1 = ET.SubElement(headerXML, "something:myVar1")
    var1.text = "FOO"
    var2 = ET.SubElement(headerXML, "something:myVar2")
    var2.text = "JAM"


headerDict=xmltodict.parse(ET.tostring(headerXML))
print (json.dumps(headerDict))

    datasoap=client.service.UserRessourcesCatalog(requete,_soapheaders=headerDict)

Но я получаю: ComplexType() получил неожиданный аргумент ключевого слова u'soapenv:Header'. Подпись: ``


person CaramuchoDotCom    schedule 22.03.2017    source источник


Ответы (2)


Недавно я столкнулся с этой проблемой, и вот как я ее решил.

Скажем, у вас есть заголовок «Безопасность», который выглядит следующим образом...

<env:Header>
<Security>
    <UsernameToken>
        <Username>__USERNAME__</Username>
        <Password>__PWD__</Password>
    </UsernameToken>
    <ServiceAccessToken>        
        <AccessLicenseNumber>__KEY__</AccessLicenseNumber>
    </ServiceAccessToken>
</Security>
</env:Header>

Чтобы отправить этот заголовок в запросе клиента zeep, вам необходимо сделать следующее:

header = zeep.xsd.Element(
            'Security',
            zeep.xsd.ComplexType([
                zeep.xsd.Element(
                    'UsernameToken',
                    zeep.xsd.ComplexType([
                        zeep.xsd.Element('Username',zeep.xsd.String()),
                        zeep.xsd.Element('Password',zeep.xsd.String()),
                    ])
                ),
                zeep.xsd.Element(
                    'ServiceAccessToken',
                    zeep.xsd.ComplexType([
                        zeep.xsd.Element('AccessLicenseNumber',zeep.xsd.String()),
                    ])
                ),
            ])
        )

header_value = header(UsernameToken={'Username':'test_user','Password':'testing'},UPSServiceAccessToken={'AccessLicenseNumber':'test_pwd'})

client.service.method_name_goes_here(
                    _soapheaders=[header_value],#other method data goes here
                )
person oblivion02    schedule 28.06.2017
comment
Спасибо за ваше объяснение Обливион - person CaramuchoDotCom; 07.07.2017
comment
Добро пожаловать. Поскольку он по-прежнему помечен как вопрос «зип», есть ли шанс, что вы смогли подтвердить, что мой ответ работает, чтобы вы могли его принять? - person oblivion02; 07.07.2017
comment
Это решение сработало очень хорошо для меня. Спасибо большое, примеров про сложные заголовки для мыльных запросов с помощью Zeep нет. - person SergioMP; 07.09.2017
comment
Рад, что помог вам SergioMP. - person oblivion02; 10.09.2017
comment
Как бы это было написано, если бы спецификация не содержала обволакивающий элемент «Безопасность», а «env:Header» просто сохранял «UsernameToken» и «ServiceAccessToken»? Это так же просто, как удалить внешний zeep.xsd.Element? У меня есть аналогичный вопрос здесь - person Liquidgenius; 18.01.2019

Спасибо Обливион02.

Я, наконец, использую необработанный метод

headers = {'content-type': 'text/xml'}
body = """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://blablabla">
<soapenv:Header>
<something:myVar1>FOO</something:myVar1>
<something:myVar2>JAM</something:myVar2>
</soapenv:Header>
<soapenv:Body>
          ...
</soapenv:Body>
</soapenv:Envelope>"""

response = requests.post(wsdl,data=body,headers=headers)
person CaramuchoDotCom    schedule 06.07.2017
comment
Как вы думаете, вы могли бы принять мой ответ? Вопрос по-прежнему помечен как вопрос zeep, поэтому, хотя ваш ответ работает с использованием необработанного метода, ответ, который я предоставил, использует библиотеку zeep. - person oblivion02; 12.09.2017