我知道这个问题很老,但我刚遇到了同样的问题,因为我正在访问一个指向错误终端点的第三方SOAP API的WSDL(第三方告诉我正确的终端点,但没有更新他们的WSDL)。 接受的答案确实指导了我正确的方向,但我想提供一些附加细节,对于像我这样相当初级的开发人员来说,这些细节并不立即显而易见。
首先要注意的是,Zeep文档显示,方法zeep.Client.create_service()有两个参数。
binding_name - 绑定的QName
address - 终端点的地址
找出binding_name
选项1-通过WSDL阅读
binding_name来自WSDL中的binding
属性。 问题在于该属性的值通常包括对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"
。
虽然这是Zeep使用的binding_name
,但你不能只是将它复制粘贴到create_service()
的参数中,因为它部分包含了WSDL中本地定义的名称xrx
。当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中收集的信息。一个标题应该说“Bindings”,后面跟着一个binding_name
列表(可能长度为1)。从那里,您可以复制需要更改端点的绑定名称。
选项3-从Zeep Client对象中获取
这个感觉更像是一个hack,但list(zeep_client.wsdl.port_types)
会给出Zeep在创建zeep_client
时在WSDL中找到的所有绑定名称的列表。
找出address
最后,为了完整起见,address
只是您想要使用的新端点,而不是在WSDL中定义的端点。
我希望这有助于平滑某人的学习曲线!