suds中的"<faultcode/>未映射到消息部分"是什么意思?
我第一次使用suds,想要和一个外部公司的服务器进行通信。当我在服务器上调用一个方法时,得到了这个XML的响应。
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>Can't use string ("") as an ARRAY ref while "strict refs" in use at /vindicia/site_perl/Vindicia/Soap/DocLitUtils.pm line 130.
</faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
抛出的异常是这个:
File "C:\Python26\lib\site-packages\suds-0.4-py2.6.egg\suds\client.py", line 538, in __call__ return client.invoke(args, kwargs) File "C:\Python26\lib\site-packages\suds-0.4-py2.6.egg\suds\client.py", line 602, in invoke result = self.send(msg) File "C:\Python26\lib\site-packages\suds-0.4-py2.6.egg\suds\client.py", line 634, in send result = self.succeeded(binding, reply.message) File "C:\Python26\lib\site-packages\suds-0.4-py2.6.egg\suds\client.py", line 669, in succeeded r, p = binding.get_reply(self.method, reply) File "C:\Python26\lib\site-packages\suds-0.4-py2.6.egg\suds\bindings\binding.py", line 157, in get_reply result = self.replycomposite(rtypes, nodes) File "C:\Python26\lib\site-packages\suds-0.4-py2.6.egg\suds\bindings\binding.py", line 227, in replycomposite raise Exception(' not mapped to message part' % tag) Exception: 'faultcode' not mapped to message part
你知道为什么suds会抛出这个异常吗?有没有什么想法可以解决这个问题?
2 个回答
1
这个问题已经在这里回答过了:suds中的“<faultcode/>没有映射到消息部分”是什么意思?
这个异常实际上是说,SOAP服务返回的答案中包含了一个叫<faultcode>
的标签,但这个标签在服务的WSDL结构中并不存在。
要记住,suds库会缓存WSDL结构,这就是为什么如果WSDL结构最近被更改了,可能会出现问题。这样的话,返回的答案是符合新结构的,但suds客户端却用的是旧的结构来验证。在这种情况下,运行rm /tmp/suds/*
命令可以帮助你解决问题。
3
我遇到过类似的问题,调用是成功的,但在解析客户端的响应时,suds崩溃了。我使用的解决办法是用 suds的选项来返回原始的XML,然后再用 BeautifulSoup 来解析这个响应。
示例:
client = Client(url)
client.set_options(retxml=True)
soapresp_raw_xml = client.service.submit_func(data)
soup = BeautifulStoneSoup(soapresp_raw_xml)
value_i_want = soup.find('ns:NewSRId')