如何使用ZEEP更改SOAP请求中的终端地址

3
我正在使用ZEEP进行SOAP请求,它很容易且效果很好。
问题在于端点URL(在WSDL中)不正确。
我可以通过直接编辑WSDL来解决问题,但这不具有可伸缩性。
我查阅了关于创建服务代理的ZEEP文档,但我不理解并且出现了错误。以下是包含错误URL的WSDL部分:
</binding>
<service name="DeviceConfigurationService">
    <port name="DeviceConfigurationPort" 
binding="xrx:DeviceConfigurationBinding">
        <soap:address 
location="http://localhost/webservices/office/device_configuration/1"/>
    </port>
    </service>

我需要更改的是位置。我需要从“localhost”更改为局域网IP地址。这个值可能经常变化,所以我不想每次都编辑WSDL。

有人知道如何使用Zeep来实现这一点吗?

非常感谢任何帮助!

2个回答

3

我知道这个问题很老,但我刚遇到了同样的问题,因为我正在访问一个指向错误终端点的第三方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中定义的端点。

我希望这有助于平滑某人的学习曲线!


0
client = Client('http://localhost/webservices/office/device_configuration/1?wsdl')

service = client.create_service(
    '{http://path-to-xrx-namespace}DeviceConfigurationBinding',
    'http://127.0.0.1/webservices/office/device_configuration/1')

service.submit('something')

1
你能解释一下你回答中的"http://path-to-xrx-namespace"是什么意思吗?官方的zeep文档中写到了(http://my-target-namespace-here}),但这到底是什么,我该如何从原始WSDL中找到它? - 576i
看起来,“path-to-xrx-namespace”是从zeep文档的“using zeep”部分中的“mzeep”工具返回的路径。如果在此处输入不正确的值,zeep会提供一个带有正确选项的有用错误消息,因此如果您不完全理解它,请从错误中获取该值... - 576i
'{http://path-to-xrx-namespace}' 是绑定所属的命名空间的显式名称。因此,'xrx:DeviceConfigurationBinding' 是绑定名称,而 'xrx' 只是一个命名空间前缀,需要用命名空间的显式名称替换,例如 '{xrx的显式命名空间名称]DeviceConfigurationBinding'。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接