从Python使用WSDL服务,是我的客户端代码还是服务器?

3 投票
2 回答
1462 浏览
提问于 2025-04-16 02:48

我正在尝试为一个WSDL服务写一个Python客户端。我使用的是Suds库来处理SOAP消息。

当我尝试调用这个服务时,出现了一个Suds异常:<rval />没有映射到消息部分。如果我设置了retxml这个Suds选项,我得到的XML看起来还不错。

问题出在客户端代码上吗?我是不是漏掉了什么标志,导致Suds无法正确解析这个XML?另外,问题也可能出在服务器上。这个XML的结构是否不正确?

我的代码如下(方法名已更改):

c = Client(url)  
p = c.factory.create('MyParam')  
p.value = 100  
c.service.run(p)  

这导致了一个Suds异常:

File "/home/.../test.py", line 38, in test  
res = self.client.service.run(p)
File "/usr/local/lib/python2.6/dist-packages/suds-0.3.9-py2.6.egg/suds/client.py", line 539, in __call__
return client.invoke(args, kwargs)
File "/usr/local/lib/python2.6/dist-packages/suds-0.3.9-py2.6.egg/suds/client.py", line 598, in invoke
result = self.send(msg)
File "/usr/local/lib/python2.6/dist-packages/suds-0.3.9-py2.6.egg/suds/client.py", line 627, in send  
result = self.succeeded(binding, reply.message)  
File "/usr/local/lib/python2.6/dist-packages/suds-0.3.9-py2.6.egg/suds/client.py", line   659, in succeeded  
r, p = binding.get_reply(self.method, reply)  
File "/usr/local/lib/python2.6/dist-packages/suds-0.3.9-py2.6.egg/suds/bindings/binding.py", line 151, in get_reply  
result = self.replycomposite(rtypes, nodes)  
File "/usr/local/lib/python2.6/dist-packages/suds-0.3.9-  py2.6.egg/suds/bindings/binding.py", line 204, in replycomposite  
raise Exception('<%s/> not mapped to message part' % tag)  
Exception: <rval/> not mapped to message part  

返回的XML(已修改以去除客户标识符)

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns2:getResponse xmlns:ns2="http://api.xxx.xxx.com/api/">
      <rval xmlns="http://xxx.xxx.xxx.com/api/">
        <ns2:totalNumEntries>
          2
        </ns2:totalNumEntries>
        <ns2:entries>
          <ns2:id>
            1
          </ns2:id>
        </ns2:entries>
        <ns2:entries>
          <ns2:id>
            2
          </ns2:id>
        </ns2:entries>
      </rval>
    </ns2:getResponse>
  </S:Body>
</S:Envelope>

2 个回答

1

这个异常实际上是说,SOAP服务返回的答案里有一个叫<rval>的标签,但这个标签在服务的WSDL方案里并不存在。

要记住,Suds库会缓存WSDL方案,这就意味着如果WSDL方案最近被更改了,可能会出现问题。因为返回的答案是根据新的方案来的,但suds客户端却用旧的方案来验证。在这种情况下,运行rm /tmp/suds/*命令可以帮助你解决问题。

2

可能是重复的问题,参考这个链接:Suds中的“<faultcode/>未映射到消息部分”是什么意思?

这是我在那个问题中的回答:

我遇到过类似的问题,调用是成功的,但在解析客户端的响应时,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')

撰写回答