问题描述
我通过 Zeep 和 Python 3.9 通过 SOAP 调用远程 Web 服务。 我可以使用自定义参数进行调用,但我不知道如何将返回的 XML 转换为自定义 Python 对象。
这就是我所做的:
我可以正常调用,并且可以在 Response 对象中获取结果值。
响应是一个普通的 HTTP 响应,而不是一个 Zeep 对象。我的猜测是它是来自 requests.Response
库的 requests
对象。
如您所见,我创建了一些 Python 对象来映射输入值(SI_BusTransPT_Inboudn
和 BusTransList_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 (将#修改为@)