【问题标题】:Python Zeep Client to consume Ontario Health EBS MCEDT WSDL(SOAP) webservicePython Zeep Client 使用 Ontario Health EBS MCEDT WSDL(SOAP) webservice
【发布时间】:2020-03-17 21:15:03
【问题描述】:

我一直在尝试使用 Zeep 生成 SOAP 信封以调用以下 WSDL 中的方法:

https://ws.conf.ebs.health.gov.on.ca:1443/EDTService/EDTService?wsdl

到目前为止,我想出了这个:

from zeep import Client, xsd
from zeep.transports import Transport
from requests import Session
import urllib3
from zeep.plugins import HistoryPlugin

urllib3.disable_warnings()

session = Session()
session.verify = False
transport = Transport(session=session)

history = HistoryPlugin()
client = Client(wsdl='https://ws.conf.ebs.health.gov.on.ca:1443/EDTService/EDTService?wsdl', 
transport=transport, plugins=[history])

# client.wsdl.dump()

ebsheader = xsd.Element(
    '{http://ebs.health.ontario.ca/}EBS',
    xsd.ComplexType([
       xsd.Attribute(
          'Id',xsd.String()
       ),
       xsd.Element(
           'SoftwareConformanceKey', xsd.String()
       ),
       xsd.Element(
           'AuditId', xsd.String()
       ),
   ])
)
headers = []
headers.append(ebsheader('id-1','software-key-here','unique-id'))

response = client.service.getTypeList(_soapheaders=headers)

我离生成一个看起来像 API 规范中提供的示例的信封还差得很远。

作为 SOAP/WSDL 的新手,我很难理解超级复杂的 API 规范 http://www.health.gov.on.ca/en/pro/publications/ohip/docs/techspec_ebs.pdf

有没有人能够使用 Zeep 使用这个 API?

【问题讨论】:

  • 你真正想做什么?生成信封还是要调用方法?
  • @Tarique 我想调用一个名为“getTypelist”的方法并最终调用“上传”
  • 如果答案有效,请接受答案或在尝试后提供反馈。
  • @Tarique 我尝试使用您建议的方式调用该方法,但会导致 SSL 错误

标签: python soap wsdl soap-client zeep


【解决方案1】:

如果您查看zeep 的文档,您会发现它使调用soap 服务方法变得非常容易。

首先您需要检查 wsdl: python -mzeep https://ws.conf.ebs.health.gov.on.ca:1443/EDTService/EDTService?wsdl

然后你可以在里面看到getTypelist的定义(考虑第一个绑定):

getTypeList(_soapheaders={ebsrequest_header: ns0:ebs_header, msarequest_header: 
ns3:msa_header, idprequest_header: ns2:idp_header}) -> return: ns1:typeListResult

所以你需要创建ebs_header, msa_header & idp_header。为每个创建一个工厂:

factory0 = client.type_factory('ns0')
factory2 = client.type_factory('ns2')
factory3 = client.type_factory('ns3')

然后创建每个元素:

ebs_header = factory0.ebs_header(SoftwareConformanceKey="key", AuditId="id")
print(ebs_header)

msa_header = factory3.msa_header(ServiceUserMUID="muid", UserID="uid")
print(msa_header)

idp_header = factory2.idp_header(ServiceUserMUID="muid")
print(idp_header)

# then create the _soapheaders
headers = {
    'ebsrequest_header' : ebs_header,
    'msarequest_header' : msa_header,
    'idprequest_header' : idp_header
    }

#finally call the method
response = client.service.getTypeList(_soapheaders=headers)

# you can see the sent request from plugin:
print(history.last_sent)

请注意,我尝试运行代码但出现连接错误。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-09
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多