Python Zeep SOAP 客户端模块 - 无法为元素设置属性
Posted
技术标签:
【中文标题】Python Zeep SOAP 客户端模块 - 无法为元素设置属性【英文标题】:Python Zeep SOAP client module - can't set attributes for an element 【发布时间】:2016-11-28 15:51:48 【问题描述】:我对 Python 有点生疏,但我需要使用 zeep 客户端设置一个 SOAP 调用。我通过只传入一个字典对象成功地调用了几个方法,但是我没有设置这一部分的运气,我不确定是否可以使用这种技术。
这是我遇到问题的信封部分:
<xs:complexType name="setupParameter">
<xs:sequence />
<xs:attribute name="key" type="xs:string" use="required" />
<xs:attribute name="value" type="xs:string" use="required" />
</xs:complexType>
内嵌:
<xs:complexType name="transportSettings">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="setupParameter" type="tns:setupParameter" />
</xs:sequence>
</xs:complexType>
我尝试像这样传递这个参数:
'transportSettings':
[
'setupParameter': 'key': 'key1', 'value': 'val1',
'setupParameter': 'key': 'key2', 'value': 'val2'
]
在信封内,但它似乎不起作用。
由于 SOAP 方法没有很好的验证,它确实创建了两个 setupParameter
类型的项目,但它们都缺少 key
和 value
值。
请帮我解释一下。
编辑1
这是我试图复制的 SoapUI(请求的一部分)的输出:
<transportSettings>
<!--Zero or more repetitions:-->
<setupParameter key="?" value="?"/>
</transportSettings>
编辑2
所以,我向 zeep 客户端添加了一个插件(如他们的文档中所述),它打印出 SOAP 请求和响应,这就是请求:
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Body>
<ns0:provisionService xmlns:ns0="http://ntc.nms.slm.hub.provisioning">
<service>
<vn>test</vn>
<serviceClass>Satellite Internet Access - 3100 Forward</serviceClass>
<linkType>MULTIPLE_ACCESS</linkType>
<channelCarrier>false</channelCarrier>
<transportSettings>
<setupParameter key="" value=""/>
</transportSettings>
<multicastRequired>false</multicastRequired>
<linkTopology>POINT_TO_POINT</linkTopology>
<serviceGuiOptions>
<enableBooking>true</enableBooking>
<enableUnManagedTransmitter>false</enableUnManagedTransmitter>
<enableCustomSetupParameters>true</enableCustomSetupParameters>
</serviceGuiOptions>
<qosParameters>
<bestEffortPirFixed>0</bestEffortPirFixed>
<bestEffortPirPct>0</bestEffortPirPct>
<criticalData1CirFixed>0</criticalData1CirFixed>
<criticalData1CirPct>0</criticalData1CirPct>
<criticalData1PirFixed>0</criticalData1PirFixed>
<criticalData1PirPct>0</criticalData1PirPct>
<criticalData2CirFixed>0</criticalData2CirFixed>
<criticalData2CirPct>0</criticalData2CirPct>
<criticalData2PirFixed>0</criticalData2PirFixed>
<criticalData2PirPct>0</criticalData2PirPct>
<criticalData3CirFixed>0</criticalData3CirFixed>
<criticalData3CirPct>0</criticalData3CirPct>
<criticalData3PirFixed>0</criticalData3PirFixed>
<criticalData3PirPct>0</criticalData3PirPct>
<realTime1CirFixed>6000</realTime1CirFixed>
<realTime1CirPct>0</realTime1CirPct>
<realTime2CirFixed>0</realTime2CirFixed>
<realTime2CirPct>0</realTime2CirPct>
<realTime3CirFixed>0</realTime3CirFixed>
<realTime3CirPct>80</realTime3CirPct>
</qosParameters>
</service>
</ns0:provisionService>
</soap-env:Body>
</soap-env:Envelope>
从这个输入字典创建(通过像这样传递 - client.service.serviceName(inputDict)
):
'serviceClass': '$serviceName',
'vn': '$testVnName',
'linkType': 'MULTIPLE_ACCESS',
'linkTopology': 'POINT_TO_POINT',
'serviceGuiOptions':
'enableBooking': 1,
'enableUnManagedTransmitter': 0,
'enableCustomSetupParameters': 1
,
'multicastRequired': 0,
'channelCarrier': 0,
'qosParameters':
'realTime1CirFixed': 6000,
'realTime1CirPct': 0,
'realTime2CirFixed': 0,
'realTime2CirPct': 0,
'realTime3CirFixed': 0,
'realTime3CirPct': 80,
'criticalData1CirFixed': 0,
'criticalData1CirPct': 0,
'criticalData1PirFixed': 0,
'criticalData1PirPct': 0,
'criticalData2CirFixed': 0,
'criticalData2CirPct': 0,
'criticalData2PirFixed': 0,
'criticalData2PirPct': 0,
'criticalData3CirFixed': 0,
'criticalData3CirPct': 0,
'criticalData3PirFixed': 0,
'criticalData3PirPct': 0,
'bestEffortPirFixed': 0,
'bestEffortPirPct': 0
,
'transportSettings': [
'setupParameter': 'key': 'forwardGateway', 'value': 'dialog',
'setupParameter': 'key': 'referenceServiceProfileDomainName', 'value': 'hno'
]
而我想要的是(只是有问题的部分):
<transportSettings>
<setupParameter key="key1" value="val1"/>
<setupParameter key="key2" value="val2"/>
<setupParameter key="key3" value="val3"/>
</transportSettings>
【问题讨论】:
【参考方案1】:不确定您是否已经设法自己找到解决方案。
不过请看这里:http://docs.python-zeep.org/en/master/datastructures.html
<element name='ElementName'>
<complexType xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<choice maxOccurs="unbounded">
<sequence>
<element name="item_1_a" type="string"/>
<element name="item_1_b" type="string"/>
</sequence>
<element name="item_2" type="string"/>
</choice>
</complexType>
而不是通过将它们添加到元素本身来嵌套您的信息。 _value_1 指父项中的第一选择。
element = client.get_element('ns0:ElementName')
obj = element(_value_1='item_1_a': 'foo', 'item_1_b': 'bar')
希望这会有所帮助!
【讨论】:
以上是关于Python Zeep SOAP 客户端模块 - 无法为元素设置属性的主要内容,如果未能解决你的问题,请参考以下文章
我需要创建一个使用 ZEEP 或 REQUEST 模块调用 SOAP GET 方法的 python 脚本
带有Zeep的Python SOAP客户端 - 导入命名空间
带有 Zeep 和 Python 的 SOAP 客户端中的不记名令牌授权标头