【问题标题】:Using WSDL service from Python, it is my client code or the server?使用 Python 中的 WSDL 服务,它是我的客户端代码还是服务器?
【发布时间】:2011-03-29 22:29:45
【问题描述】:

我正在尝试为 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>

【问题讨论】:

    标签: python wsdl soap-client suds


    【解决方案1】:

    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')
    

    【讨论】:

      【解决方案2】:

      这个异常实际上意味着来自 SOAP-service 的答案包含标签 &lt;rval&gt;,该标签在服务的 WSDL-scheme 中不存在。

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

      【讨论】:

        猜你喜欢
        • 2018-06-06
        • 1970-01-01
        • 2015-11-04
        • 1970-01-01
        • 1970-01-01
        • 2020-07-18
        • 2010-09-29
        • 1970-01-01
        相关资源
        最近更新 更多