项目中需要用到 python 调用 java的web service的接口
接口是"http://xxx?wsdl"
我先尝试了suds接口,发现报下列错误
因为没有网络所以访问不到http://schemas.xmlsoap.org/soap/encoding/这个地址,所以就在网上搜索答案,suds太老旧了,网上有用的信息很少,大部分答案都是 imp = Import(‘http://www.w3.org/2001/XMLSchema’,
location=‘http://www.w3.org/2001/XMLSchema.xsd’)
imp.filter.add(‘xxx’)
Client(wsdl_url,doctor = ImportDoctor(imp))
示例代码是可以解决的,但是放在没有网络的生产环境还是不行。
官方文档中https://wiki.python.org/moin/WebServices还提出zeep。
我发现zeep也是可以解决问题的,所以就转投了zeep的怀抱。
结果发现zeep也是会报网络问题
好在这个用的人比较多,网络上找到了答案,最终解决了问题,重写Transport类,当要获取外部网络url时,读取服务器上的xml文件。
from zeep.transports import Transport
class CustomTransport(Transport):
def load(self, url):
# Custom URL overriding to local file storage
if url and url == "http://schemas.xmlsoap.org/soap/encoding/":
url = '/xxxxx.xml'
# Call zeep.transports.Transport's load()
return super(CustomTransport, self).load(url)
from requests import Session
from zeep import Client
wsdl_url='http://xxxx?wsdl'
session = Session()
client = Client(wsdl_url, transport=CustomTransport(session=session))
params=json.dumps(body_data)
client.service.xxxx(body_data)