我知道这个问题很老,但我刚刚遇到了同样的问题,因为我正在使用指向错误端点的 WSDL 访问第三方 SOAP API(第三方告诉我正确的端点但没有更新他们的 WSDL) . 接受的答案确实为我指明了正确的方向,但我想提供一些额外的细节,这些细节对于像我这样的新手开发人员来说并不明显。
首先注意到Zeep 的文档显示方法 zeep.Client.create_service() 有两个参数。
binding_name –绑定的QName
地址 - 端点的地址
弄清楚binding_name
选项 1 - 通读 WSDL
binding_name 来自binding
WSDL 中的属性。问题是该属性的值通常包括对 WSDL 中其他地方的名称的引用,您必须在使用它来创建自定义服务之前手动解析该名称。
对于 OP 的 WSDL 的摘录(稍微格式化并添加了 *** 强调
***)...
<service name="DeviceConfigurationService">
<port name="DeviceConfigurationPort" ***binding="xrx:DeviceConfigurationBinding"***>
<soap:address location="http://localhost/webservices/office/device_configuration/1"/>
</port>
</service>
... 的binding
值为"xrx:DeviceConfigurationBinding"
。
虽然这是binding_name
Zeep 使用的名称,但您不能只是将其复制并粘贴到参数中,create_service()
因为它部分包含xrx
- 在 WSDL 中本地定义的名称。Zeep 在最初解析 WSDL 时会自动解析这种名称的值,因此当您告诉 Zeep 将现有绑定指向不同的端点时,您必须自己解析绑定名称,以便 Zeep 知道您在谈论哪个绑定(即为什么@jeffgabhart{https://path-to-xrx-namespace}
在他的回答中使用)。最后你应该得到完整binding_name
的格式{NAMESPACE}BINDING
。
请注意,这xrx
不是唯一可能的名称。对我来说,这个名字是tns
,对你来说,它可能是不同的东西。不管它是什么,您都应该能够在 WSDL 的某处找到该名称的定义。
选项 2 - 使用 Zeep 的 WSDL 解析实用程序
另一种选择是@576i 建议的。运行该命令python -mzeep WSDL_URL
将输出 Zeep 从给定 WSDL 收集的信息。一个标题应该说“绑定”,然后是一个列表(可能长度为 1)binding_name
。从那里您可以复制您需要更改端点的那个。
选项 3 - 从 Zeep Client 对象中获取它
这个感觉更像是一个 hack,但list(zeep_client.wsdl.port_types)
提供了 Zeep 在用于创建zeep_client
.
弄清楚address
最后,为了完整起见,这address
只是您要使用的新端点,而不是 WSDL 中定义的端点。
我希望这有助于平滑某人的学习曲线!