我一直在尝试使用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?
发布于 2020-03-19 15:14:56
如果您查看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)请注意,我试图运行代码,但我得到了连接错误。
希望这能有所帮助。
https://stackoverflow.com/questions/60730325
复制相似问题