Python - Zeep SOAP 复杂标头

问题描述 投票:0回答:3

我想使用 zeep 库将“复杂”标头传递给 SOAP 服务

它应该是这样的

 <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 Element 对象。如果 wsdl 未定义soap标头但服务器确实需要它,那么这通常很有用。”

这是我的情况,所以我尝试了

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'。签名:``

python-3.x soap zeep
3个回答
31
投票

我最近遇到了这个问题,这是我解决的方法。

假设您有一个如下所示的“安全”标头...

<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
                )

2
投票

谢谢遗忘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)

0
投票

来自其他回复

使用 Zeep 和 Python 的 SOAP 客户端中的 Bearer Token 授权标头

import requests
from zeep import Client, Transport

headers = {
    "Authorization": "Bearer " + get_token()
}
session = requests.Session()
session.headers.update(headers)
transport = Transport(session=session)
client = Client(wsdl=url, transport=transport)

© www.soinside.com 2019 - 2024. All rights reserved.