您可以使用 Async Zeep 在 Basic Auth 后面调用 SOAP 服务吗?

问题描述

我正在尝试将 Zeep 库的先前工作同步使用转换为此的异步版本。在向 WSDL 发出请求时,传输将始终返回 404。

以下是同步实现并按预期工作。

session = Session()
session.auth = HTTPBasicAuth(username,password)
transport = Transport(session=session)

return Client(config_url,transport=transport)

但是,当我将其更改为异步实现(使用 httpx)时,它将返回传输错误。此传输错误中的唯一消息是 401

http_client = httpx.Client()
http_client.auth = (username,password)
http_client.verify = True
transport = AsyncTransport(session=http_client)

return Asyncclient(config_url,transport=transport)

我是否正确使用了异步 Zeep?根据 docs 它应该像这样工作

解决方法

好吧,显然界面不完全一样。要使用基本身份验证为 zeep 实例化 AsyncClient,您需要创建一个同步和异步客户端。

这是因为 zeep 以同步方式获取 WSDL,然后异步执行请求。这意味着 wsdl_client 必须是同步的,而 client 必须是异步的!

async_client = httpx.AsyncClient(
   auth=(username,password),verify=True
)
wsdl_client = httpx.Client(
    auth=(username,verify=True
)

transport = AsyncTransport(client=async_client,wsdl_client=wsdl_client)

return AsyncClient(config_url,transport=transport)

有了这个,我们现在可以等待文档中描述的所有服务请求。