python suds soap call开始和结束标记名称不匹配

时间:2014-01-23 20:44:43

标签: python soap

对于肥皂而言,我是个新手,但这就是我所拥有的。如果我用perl的SOAP :: Lite库进行soap调用,一切都很酷。当我使用suds进行相同的调用时,我从服务器收到错误。

以下是perl调用生成的工作xml:

<?xml version="1.0" encoding="UTF-8"?>
 <soap:Envelope 
 soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
 xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
 xmlns:urn="urn:webservicesapi" 
 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soap:Body>
        <urn:getChassis xsi:nil="true" />
    </soap:Body>
 </soap:Envelope>

与suds进行相同的调用,我得到了这个xml生成的

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope 
    xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:ns1="urn:webservicesapi" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header/>
    <ns0:Body>
        <ns1:getChassis/>
    </ns0:Body>
</SOAP-ENV:Envelope>

服务器产生的错误是:<ErrorCode>43</ErrorCode><Description>Start and end tag names don't match</Description>

如果我在浏览器中使用soap插件,我可以复制它。如果我将身体改为:

<SOAP-ENV:Body>
            <urn:getChassis xsi:nil="true" />
</SOAP-ENV:Body>

通话工作正常。

所以,我要么知道如何更改Body和urn的前缀:或者我需要理解为什么开始和结束标记名称不匹配?

据我所知,我可以使用suds.plugin导入MessagePlugin在发送之前操作xml,但我在这里不知所措。

非常感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:0)

行。得到它的工作。

class EnvelopeFixer(MessagePlugin): 
    def marshalled(self, context): 
    context.envelope.getChild('ns0:Body').setPrefix('ns1') 

然后我在创建客户端对象时调用了插件

client = Client(WSDL_LOCATION, transport=t, location=url, plugins=[EnvelopeFixer()])