我正在尝试为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>
答案 0 :(得分:2)
可能重复What does suds mean by "<faultcode/> not mapped to message part"?
以下是我对这个问题的回答:
我有一个类似的问题,呼叫成功,并且Suds在解析来自客户端的响应时崩溃了。我使用的解决方法是使用Suds option to return raw 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')
答案 1 :(得分:1)
此异常实际上意味着SOAP-service的答案包含标记<rval>
,该标记在服务的WSDL方案中不存在。
请记住,Suds库缓存了WSDL方案,这就是为什么如果最近更改了WSDL方案可能会出现问题的原因。然后答案与新方案匹配,但由suds-client验证旧方案。在这种情况下,rm /tmp/suds/*
会对您有所帮助。