加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python-3.x – Python – Zeep SOAP复杂标题

发布时间:2020-12-20 12:38:39 所属栏目:Python 来源:网络整理
导读:我想将“Complex”Header传递给带有zeep库的SOAP服务 这是它应该是什么样子 soapenv:Header something:myVar1FOO/something:myVar1 something:myVar2JAM/something:myVar2 /soapenv:Header 我想我成功地以这种方式发送标题 header = xsd.Element( '{http://u
我想将“Complex”Header传递给带有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在我的Header中声明并传递命名空间“something”.

任何帮助?

先谢谢.

最好的祝福

正如文档中提到的那样

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’.签名:“

解决方法

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

假设您有一个“安全”标题,如下所示……

<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.Element(
                    'ServiceAccessToken',zeep.xsd.ComplexType([
                        zeep.xsd.Element('AccessLicenseNumber',])
        )

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
                )

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读