如何防止SUDS检查WSDL

时间:2014-02-19 11:37:15

标签: python web-services suds

现在我正在为我的客户编写简单的OpenERP模块。我使用SUDS与银行连接,以获取声明。

我写了xml请求,没有问题。我得到银行的回复,看起来也不错。问题是来自银行使用类型的响应,这在WSDL中没有定义(我写信给银行支持,他们有一个错误)。

Traceback (most recent call last):
  File "example3.py", line 112, in <module>
    wiadomosc = client.service.GetStatement(__inject={'msg': xml})
  File "/usr/lib/python2.7/dist-packages/suds/client.py", line 542, in __call__
    return client.invoke(args, kwargs)
  File "/usr/lib/python2.7/dist-packages/suds/client.py", line 773, in invoke
    return self.send(msg)
  File "/usr/lib/python2.7/dist-packages/suds/client.py", line 647, in send
    result = self.succeeded(binding, reply.message)
  File "/usr/lib/python2.7/dist-packages/suds/client.py", line 684, in succeeded
    reply, result = binding.get_reply(self.method, reply)
  File "/usr/lib/python2.7/dist-packages/suds/bindings/binding.py", line 156, in get_reply
    result = self.replycomposite(rtypes, nodes)
  File "/usr/lib/python2.7/dist-packages/suds/bindings/binding.py", line 230, in replycomposite
    sobject = unmarshaller.process(node, resolved)
  File "/usr/lib/python2.7/dist-packages/suds/umx/typed.py", line 66, in process
    return Core.process(self, content)
  File "/usr/lib/python2.7/dist-packages/suds/umx/core.py", line 48, in process
    return self.append(content)
  File "/usr/lib/python2.7/dist-packages/suds/umx/core.py", line 63, in append
    self.append_children(content)
  File "/usr/lib/python2.7/dist-packages/suds/umx/core.py", line 140, in append_children
    cval = self.append(cont)
  File "/usr/lib/python2.7/dist-packages/suds/umx/core.py", line 61, in append
    self.start(content)
  File "/usr/lib/python2.7/dist-packages/suds/umx/typed.py", line 80, in start
    raise TypeNotFound(content.node.qname())
suds.TypeNotFound: Type not found: 'ns29:BkToCstmrStmt'

和类型,他们提供

    ....
    ns37:BaselineStatus3Code
    ns32:BatchBookingIndicator
    ns33:BatchBookingIndicator
    ns36:BatchBookingIndicator
    ns30:BatchInformation1
    ns31:BatchInformation2
    ns29:BatchInformation2
    ns39:BilateralLimitDetails3
    ns27:BkToCstmrCardRptType
    ns27:BkTxCdType
    ns27:BookgDtType
    ns10:BookingDate
    ns4:Bool
    ns16:Bool
    ns2:Bool
    ns15:Bool
    ns17:BouldingNumber
    ....

所以没有BkToCstmrStmt。如何从服务器获取响应,而不是分析它?刚建树?

谢谢

1 个答案:

答案 0 :(得分:0)

我仍然不知道我的代码有什么问题。我以这种方式解决了它:

class MessageInterceptor(suds.plugin.MessagePlugin):
    def __init__(self, *args, **kwargs):
        self.message = None

    def received(self, context):
        #recieved xml as a string
        #print "%s bytes received" % len(context.reply)
        self.message = context.reply
        #clean up reply to prevent parsing
        context.reply = ""
        return context

    message_interceptor = MessageInterceptor()

    client = Client('https://some-adress-to?wsdl',plugins=[message_interceptor])

所以现在我可以调用客户端方法

    xml = Raw("""
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
       <soapenv:Header>
       ...
       </soapenv:Header>
       <soapenv:Body>
          <urn1:GetStatement>
             ...
          </urn1:GetStatement>
       </soapenv:Body>
    </soapenv:Envelope>
    """)

    response = client.service.GetStatement(__inject={'msg': xml})

现在suds认为从服务器中得不到任何东西。但我们收到的消息存储在

message_interceptor.message

现在从消息中获取正常的dict对象我就是这样做的:

import xmltodict
message_interceptor.message = message_interceptor.message.replace('ns17:','')
message_interceptor.message = message_interceptor.message.replace('ns40:','')
message_interceptor.message = message_interceptor.message.replace('soap:','')
response = xmltodict.parse(message_interceptor.message)['Envelope']['Body']['GetStatementResponse']['Document']

现在我可以使用响应作为suds的正常响应。