对于肥皂而言,我是个新手,但这就是我所拥有的。如果我用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,但我在这里不知所措。
非常感谢任何帮助或建议。
答案 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()])