如何在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>
这是我用Python写的客户端代码。
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得到的输出,但被网络服务拒绝了,它为两个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})
但是这是SOAPpy生成的XML输出。
<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覆盖了,而不是创建两个条目……
1 个回答
1
在尝试了几个不同的库(比如suds和soaplib)之后,我最终决定深入研究SOAPpy的代码。
为了从我的SOAP请求中去掉数组,我修改了SOAPpy库中SOAPBuilder类里的dump_list()函数。
# 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)
这个修改让我得到了以下的SOAP XML请求输出。
<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>