Soap 带复合割台的Zeep

Soap 带复合割台的Zeep,soap,zeep,Soap,Zeep,使用zeep 3.4.0 wsdl正在标头中查找以下信息 <soapenv:Header>\n <vv:sessionHeader soapenv:mustUnderstand=\"1\">\n <vv:sessionToken>\n <vv:Token1 xmlns:vv=\"http://www.z.com/zTypes.xs

使用zeep 3.4.0

wsdl正在标头中查找以下信息

    <soapenv:Header>\n        
        <vv:sessionHeader soapenv:mustUnderstand=\"1\">\n
            <vv:sessionToken>\n
                <vv:Token1 xmlns:vv=\"http://www.z.com/zTypes.xsd\">{{Token1Token}}
                </vv:Token1>\n
                <vv:Token2 xmlns:vv=\"http://www.z.com/zTypes.xsd\">{{Token2Token}}
                </vv:Token2>\n
            </vv:sessionToken>\n
        </vv:sessionHeader>\n
标题_值1如下所示

    {
        'sessionHeader': {
            'Token1': 'abcdef=',
            'Token2': 'ghijkl='
        }
    }
我得到以下错误:

    line 365, in _serialize_header
    raise ValueError("Invalid value given to _soapheaders")
\u serialize\u header要求header\u value1为列表或字典

isinstance(标题值1,dict)返回False

问题:

  • 向SOAPHeader传递参数的正确方法是什么
  • 为什么sessionToken没有反映在标题中

我没有使用内置方法,而是使用了

    header_value1 = {'sessionHeader': {'sessionToken': { \
    'primary': token1, secondary': token2}}}

使用Zeep调试东西总是有点困难,但这里有一个可行的实现:

为了正确呈现两个元素(Token1和Token2),您需要xsd:Sequence元素:

   headerQ = xsd.Element('Header', xsd.ComplexType([
     xsd.Element('{http://www.z.com/zTypes.xsd}sessionHeader', xsd.ComplexType([
       xsd.Element('{http://www.z.com/zTypes.xsd}sessionToken', xsd.ComplexType(
         xsd.Sequence([
           xsd.Element('{http://www.z.com/zTypes.xsd}Token1', xsd.String()),
           xsd.Element('{http://www.z.com/zTypes.xsd', xsd.String())
          ])))
        ], attributes=[xsd.Attribute('mustUnderstand', xsd.Boolean())
     ]))
   ]))
提供QNames而不是原始元素名将处理名称空间,最后在sessionToken类型定义上设置属性。如果您的soap服务器拒绝接受“true”,那么您可以使用xsd:Integer类型,或者您可以使用出口插件将“true”重写为“1”

设置标题值的工作方式与您尝试的相同,但您需要将其包装到列表中:

header_value1 = headerQ(
  {'mustUnderstand': True,
   'sessionToken': {'Token1': 'Token1T',
                    'Token2': 'Token2T'}
  }
)
client.set_default_soapheaders([header_value1])
这将提供标题部分:

<Header>
  <ns0:sessionHeader xmlns:ns0="http://www.z.com/zTypes.xsd" mustUnderstand="true">
    <ns0:sessionToken>
      <ns0:Token1>Token1T</ns0:Token1>
      <ns0:Token2>Token2T</ns0:Token2>
    </ns0:sessionToken>
  </ns0:sessionHeader>
</Header>

代币1T
代币2T
<Header>
  <ns0:sessionHeader xmlns:ns0="http://www.z.com/zTypes.xsd" mustUnderstand="true">
    <ns0:sessionToken>
      <ns0:Token1>Token1T</ns0:Token1>
      <ns0:Token2>Token2T</ns0:Token2>
    </ns0:sessionToken>
  </ns0:sessionHeader>
</Header>