2010-02-25 11 views
0

Je suis en train de passer plusieurs instances d'un élément à un serviles Web qui a le wsdl suivantComment passer un paramètre de liste sous la forme de plusieurs éléments nommés par un lien au lieu d'un tableau dans SOAPpy?

<complexType name="OAMCommand"> 
    <sequence> 
    <element name="m-strName" type="xsd:string" minOccurs="1" maxOccurs="1"/> 
    <element name="m-argVector" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> 
    </sequence> 
    </complexType> 

Ceci est mon code en python pour le client

oamCmdStruct = SOAPpy.structType() 
    oamCmdStruct._addItem('m-strName','set-log-level') 
    oamCmdStruct._addItem('m-argVector', logLevel) 
    oamCmdStruct._addItem('m-argVector', loggerName) 
    self.serverConnection.executeCommand({'in-cmd':oamCmdStruct} 

Voici la sortie que je reçois de SOAPpy qui est rejetée par le service Web, il crée un tableau pour les éléments 2 m-argVector.

<xsd:in-cmd> 
    <m-strName xsi:type="xsd:string">set-log-level</m-strName> 
    <m-argVector SOAP-ENC:arrayType="xsd:string[2]" xsi:type="SOAP-ENC:Array"> 
    <item>WARN_LOG_LEVEL</item> 
    <item>netborder</item> 
    </m-argVector> 
</xsd:in-cmd> 

Voici la sortie qu'un autre client envoie qui fonctionne. Pas de tableau, juste deux éléments qui ont le même nom. Comment puis-je modifier mon code SOAPpy pour générer la sortie xml comme celle ci-dessus?

<SoapOAM:executeCommand> 
     <in-cmd> 
     <m-strName>set-log-level</m-strName> 
     <m-argVector>ERROR_LOG_LEVEL</m-argVector> 
     <m-argVector>netborder.media</m-argVector> 
     </in-cmd> 
    </SoapOAM:executeCommand> 

EDIT: J'ai essayé le code suivant en python

oamCmdStruct = SOAPpy.structType(data = {"m-strName":"set-log-level", 
               "m-argVector": logLevel, 
               "m-argVector": loggerName}) 

Mais c'est ce que la sortie XML de SOAPpy ressemblait

<xsd:in-cmd> 
    <m-strName xsi:type="xsd:string">set-log-level</m-strName> 
    <m-argVector xsi:type="xsd:string">loggerName</m-argVector> 
</xsd:in-cmd> 

La valeur logLevel est écrasée par loggerName au lieu de créer 2 entrées ...

Répondre

0

Après avoir essayé quelques librairies différentes (suds, soaplib), j'ai finalement creusé dans le code SOAPpy.

Afin de supprimer les tableaux de mes requêtes SOAP, j'ai modifié le dump_list() fonction dans la classe SOAPBuilder de la bibliothèque SOAPpy.

# COMMENT: We dont want arrays in SOAP-XML so I commented out the following lines 
# if typed: 
# self.out.append(
#  '<%s %sarrayType="%s[%d]" %stype="%sArray"%s%s%s%s%s%s>\n' % 
#  (tag, ens, t, len(data), ins, ens, ndecl, edecl, idecl, 
#   self.genroot(ns_map), id, a)) 

#if typed: 
# try: elemsname = obj._elemsname 
# except: elemsname = "item" 
#else: 
elemsname = tag 

for i in data: 
    self.dump(i, elemsname, not same_type, ns_map) 

#if typed: self.out.append('</%s>\n' % tag) 

Cette modification me donne la sortie suivante pour ma requête XML SOAP.

<SOAP-ENV:Body> 
<ns1:executeCommand xmlns:ns1="urn:SoapOAM"> 
<xsd:in-cmd> 
<m-strName xsi:type="xsd:string">set-log-level</m-strName> 
<m-argVector>ERROR_LOG_LEVEL</m-argVector> 
<m-argVector>netborder</m-argVector> 
</xsd:in-cmd> 
</ns1:executeCommand> 
</SOAP-ENV:Body> 
+0

Une solution plus élégante serait de mettre la valeur ** typed ** à 0 au lieu de commenter tout ce code ... –