5

我第一次使用 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>

抛出的异常是这样的:

  __call__ 中的文件“C:\Python26\lib\site-packages\suds-0.4-py2.6.egg\suds\client.py”,第 538 行
    返回 client.invoke(args, kwargs)
  调用中的文件“C:\Python26\lib\site-packages\suds-0.4-py2.6.egg\suds\client.py”,第 602 行
    结果 = self.send(msg)
  文件“C:\Python26\lib\site-packages\suds-0.4-py2.6.egg\suds\client.py”,第 634 行,在发送中
    结果 = self.succeeded(绑定,reply.message)
  文件“C:\Python26\lib\site-packages\suds-0.4-py2.6.egg\suds\client.py”,第 669 行,成功
    r, p = binding.get_reply(self.method, 回复)
  文件“C:\Python26\lib\site-packages\suds-0.4-py2.6.egg\suds\bindings\binding.py”,第 157 行,在 get_reply
    结果 = self.replycomposite(rtypes,节点)
  文件“C:\Python26\lib\site-packages\suds-0.4-py2.6.egg\suds\bindings\binding.py”,第 227 行,replycomposite
    raise Exception('未映射到消息部分'% 标记)
例外:“故障代码”未映射到消息部分

知道为什么 suds 会抛出异常吗?关于如何修复它的任何想法?

4

2 回答 2

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')
于 2013-09-22T20:45:26.927 回答
1

已在此处回答:“<faultcode/> 未映射到消息部分”是什么意思?

此异常实际上意味着来自 SOAP-service 的答案包含 tag <faultcode>,该标签在服务的 WSDL 方案中不存在。

请记住,suds 库缓存 WSDL 方案,这就是如果最近更改 WSDL 方案可能会出现问题的原因。然后答案与新方案匹配,但由 suds-client 与旧方案进行验证。在这种情况下rm /tmp/suds/*会帮助你。

于 2014-08-01T09:34:30.027 回答