创建Zeep Client时如何定义资源Base URL?解决WSDL解析404问题
解决Zeep解析WSDL时XSD资源路径错误的问题
方法1:自定义传输适配器指定Base URL
Zeep支持通过自定义Transport类修改资源请求路径,重写load方法即可将XSD的请求URL替换到正确目录。假设SuministroInformacion.xsd实际位于WSDL所在目录的上一级,代码示例如下:
import zeep from zeep.transports import Transport from requests import Session class CustomTransport(Transport): def load(self, url): # 替换XSD的请求路径,移除URL中的/WSDL/部分 if 'SuministroInformacion.xsd' in url: correct_url = url.replace('/WSDL/', '/') return super().load(correct_url) return super().load(url) session = Session() transport = CustomTransport(session=session) client = zeep.Client( 'https://sede.agenciatributaria.gob.es/static_files/Sede/Procedimiento_ayuda/G417/FicherosSuministros/V_1_1/WSDL/SuministroFactEmitidas.wsdl', transport=transport )
方法2:本地下载文件修改路径
如果自定义传输逻辑太繁琐,可直接下载WSDL和对应XSD文件到本地,修改WSDL中的XSD引用路径后加载本地文件:
- 下载
SuministroFactEmitidas.wsdl和SuministroInformacion.xsd到本地同一目录 - 编辑本地WSDL文件,将XSD的相对引用改为本地路径,例如:
<xsd:import schemaLocation="./SuministroInformacion.xsd" .../> - 用Zeep加载本地WSDL:
import zeep client = zeep.Client('本地路径/local.wsdl')
方法3:手动修改WSDL内容后加载
先获取远程WSDL内容,修改其中的XSD引用URL,再手动创建Document实例初始化Zeep客户端:
import zeep from zeep.wsdl import Document import requests # 获取远程WSDL内容 wsdl_url = 'https://sede.agenciatributaria.gob.es/static_files/Sede/Procedimiento_ayuda/G417/FicherosSuministros/V_1_1/WSDL/SuministroFactEmitidas.wsdl' wsdl_content = requests.get(wsdl_url).text # 修改XSD引用为正确的相对路径 corrected_wsdl = wsdl_content.replace( 'SuministroInformacion.xsd', '../SuministroInformacion.xsd' ) # 初始化Client client = zeep.Client(wsdl=Document(zeep.helpers.parse_xml(corrected_wsdl), wsdl_url))
内容的提问来源于stack exchange,提问作者Ushyme
相关产品推荐
相关产品推荐

