Как передать параметр списка в виде нескольких элементов с именами ссылок, а не в виде массива в SOAPpy?

Я пытаюсь передать несколько экземпляров элемента веб-сервису, который имеет следующий wsdl

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

Это мой код на питоне для клиента

  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}

Вот вывод, который я получаю от SOAPpy, который отвергается веб-службой, он создает массив для 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>

Вот вывод, который отправляет другой клиент, который работает. Нет массива, просто два элемента с одинаковым именем.

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

Как я могу изменить свой код SOAPpy для создания вывода xml, подобного приведенному выше?

РЕДАКТИРОВАТЬ: я попробовал следующий код в python

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

Но вот как выглядел вывод XML из SOAPpy.

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

Значение logLevel перезаписывается loggerName вместо создания 2 записей...


person Julien Nephtali    schedule 25.02.2010    source источник


Ответы (1)


Попробовав несколько разных библиотек (suds, soaplib), я наконец вник в код SOAPpy.

Чтобы удалить массивы из моих запросов SOAP, я изменил функцию dump_list() в классе SOAPBuilder библиотеки 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)

Это изменение дает мне следующий вывод для моего 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>
person Julien Nephtali    schedule 10.03.2010
comment
Более элегантным решением было бы установить значение typed равным 0 вместо того, чтобы комментировать весь этот код... - person Julien Nephtali; 10.03.2010