Soap 带复合割台的Zeep
使用zeep 3.4.0 wsdl正在标头中查找以下信息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
<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>