2016-11-28 1 views
0

Je suis un peu rouillé avec Python mais j'ai besoin de configurer un appel SOAP avec le client zeep. J'ai réussi à appeler quelques méthodes en passant seulement un objet du dictionnaire mais je n'ai pas de chance en définissant cette partie et je ne suis pas sûr que ce soit possible avec cette technique.Module client Python Zeep SOAP - impossible de définir des attributs pour un élément

Ceci est la partie de l'enveloppe que j'ai du mal avec:

<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> 

qui est intégré à l'intérieur:

<xs:complexType name="transportSettings"> 
    <xs:sequence> 
     <xs:element maxOccurs="unbounded" minOccurs="0" name="setupParameter" type="tns:setupParameter" /> 
    </xs:sequence> 
</xs:complexType> 

J'ai essayé passer cette params comme ceci:

'transportSettings': { 
    [ 
     {'setupParameter': {'key': 'key1', 'value': 'val1'}}, 
     {'setupParameter': {'key': 'key2', 'value': 'val2'}} 
    ] 
} 

à l'intérieur de l'enveloppe mais il semble que cela ne fonctionne pas. Étant donné que la méthode SOAP n'a pas une grande validation, elle crée deux éléments de type setupParameter mais les deux valeurs key et value sont manquantes.

Poussez un peu de lumière sur ceci pour moi, s'il vous plaît.

Edit1

Ceci est la sortie de SoapUI (partie de la demande) que je suis en train de répliquer:

<transportSettings> 
    <!--Zero or more repetitions:--> 
    <setupParameter key="?" value="?"/> 
</transportSettings> 

Edit2

Alors, je l'ai ajouté un plugin pour zeep client (comme décrit dans leur documentation) qui imprime les demandes et les réponses SOAP et c'est la demande:

<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> 

qui est créé à partir de ce dictionnaire d'entrée (en passant comme celui-ci - 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'}} 
    ] 
} 

Et ce que je veux est (juste la partie problématique):

 <transportSettings> 
      <setupParameter key="key1" value="val1"/> 
      <setupParameter key="key2" value="val2"/> 
      <setupParameter key="key3" value="val3"/> 
     </transportSettings> 

Répondre

1

Non Assurez-vous que vous avez déjà trouvé la solution vous-même.

cependant prendre un coup d'oeil ici: 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> 

Et que l'imbrication vos informations en les ajoutant à l'élément lui-même. _value_1 fait référence au premier choix du parent.

element = client.get_element('ns0:ElementName') 
obj = element(_value_1={'item_1_a': 'foo', 'item_1_b': 'bar'}) 

Espérons que cela aide!