0

我对 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类型的项目,但它们都缺少keyvalue值。

请为我阐明这一点。

编辑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>
4

1 回答 1

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

希望这可以帮助!

于 2017-02-10T09:38:40.610 回答