Zeep 需要在读取 WSDL 之前配置代理
在从远程 WSDL 构建 Client 之前,先创建 Requests 会话和 Zeep Transport。
从远程 WSDL 构建 Zeep Client 时,可能会立即抓取该文档及其 import。应提前配置 Transport,而不是等 Client 已经尝试加载服务描述之后再设置代理。
from requests import Session
from zeep import Client
from zeep.transports import Transport
session = Session()
session.proxies.update({
"http": "http://proxy.example.net:8080",
"https": "http://proxy.example.net:8080",
})
transport = Transport(
session=session,
timeout=10,
operation_timeout=30,
)
client = Client(wsdl_url, transport=transport)
wsdl_url 是服务描述的实际 URL。如果该服务及其 import 可公开访问,且允许使用公共代理,HTTP 代理列表可为会话的代理 URL 提供候选。让已配置的会话保持存活以用于后续 SOAP 操作,并在该工作结束时关闭它。
Transport.timeout 控制 WSDL 和 XSD 的加载。operation_timeout 控制为服务操作发出的 HTTP 请求。因此,在构建 Client 期间出现的元数据超时,与之后方法调用超时属于不同阶段。
在此示例中,Requests 的环境集成仍然有效。如果环境中的代理值与明确需要的路由冲突,请使用 session.trust_env=False,并显式提供所需的 CA 包和身份验证设置。
如果初始化仍然失败,请检查被导入文档的 URL。顶层 WSDL 可能加载成功,而导入的 schema 使用了其他主机名或目标协议。