如何从对 SOAP Web 服务的 Zeep 服务调用中获取 python 对象?

问题描述

我通过 Zeep 和 Python 3.9 通过 SOAP 调用远程 Web 服务。 我可以使用自定义参数进行调用,但我不知道如何将返回的 XML 转换为自定义 Python 对象。

这就是我所做的: 我可以正常调用,并且可以在 Response 对象中获取结果值。 响应是一个普通的 HTTP 响应,而不是一个 Zeep 对象。我的猜测是它是来自 requests.Response 库的 requests 对象。

如您所见,我创建了一些 Python 对象来映射输入值(SI_BusTransPT_InboudnBusTransList_Out),我用示例数据填充这些值并进行调用

    #prepare sample data
    busTrans = SI_BusTransPT_Inbound() 
    busTrans.SessionID = 'xyz'
    busTrans.sourceID = '02'
    busTrans.BusTransList_Out = []

    # prepare list
    for record in records:
        row = BusTransList_Out()

        row.id = '56'
        row.Item = record['item']
        row.Price = record['price']

        busTrans.BusTransList_Out.append(row)

    # call ws
    session = Session()
    session.auth = HTTPBasicAuth(user,pwd) 
    client = Client('local/path/to/wsdl/file',settings=settings,transport=Transport(session=session))
    response = client.service.SI_BusTransPT_Inbound(**jsons.dump(busTrans)) 

我可以看到 Web 服务返回一个 HTTP 状态代码 200 和一个带有结果的 XML 信封。 通过解析 WSDL,我知道结果是这样的

#  auto generated by my script
class Response_Out(object):
    ErrorCode: str = ''
    ErrorDescription: str = ''

我可以看到 response.text 在 XML 信封中包含这些数据:

<SOAP:Envelope xmlns:SOAP='http://schemas.xmlsoap.org/soap/envelope/'>
<SOAP:Header/>
<SOAP:Body>
  <n0:MT_Cashup_Out xmlns:n0='http://mynamespace' 
    xmlns:prx='urn:sap.com:proxy:QRP:/1SAI/TAS88dA:750'>
    <ErrorCode>S</ErrorCode>
    <ErrorDescription>Sucessfully processed!</ErrorDescription>
  </n0:MT_Cashup_Out>
</SOAP:Body>
</SOAP:Envelope>

我试过强制解码:

from zeep.wsdl.messages.soap import SoapMessage

binding = list(client.wsdl.bindings.values())[0] #this get the first and only binding
op2 = list( binding.port_type.operations.values())[0]  #this gets the operation
from lxml import etree
env = etree.fromstring(call_return.text)
soapm = SoapMessage(client.wsdl,service_name,op2,binding.nsmap)
soapm.deserialize(env) #this  fails because soapm.envelope is None

# or just this,that fails..
res = binding.process_reply(client,call_return)


例如它失败了,因为 op2一个抽象操作。如果它是一个具体的子类,即 SOAPOperation,查看 Zeep 源代码,则 binding.process_reply 可以使用具体方法 process_reply()。但是现在它失败了 ProxyOperation 没有实现这个方法(或类似的东西)

我认为这会很简单,但我没有找到关于这个特定主题的文档。一些示例只返回一个 python 对象而不是我的响应,所以也许我以错误的方式调用服务? (见这个enter link description here

有什么想法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)