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

时间:2018-04-11 19:41:29

标签: python-3.x soap zeep

我正在使用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”更改为LAN IP地址。此值可能会经常更改,因此我不希望每次都必须编辑WSDL。

有没有人知道如何用Zeep做到这一点?

非常感谢任何帮助!

2 个答案:

答案 0 :(得分: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 :(得分:0)

我知道这个问题很老,但我遇到了同样的问题,因为我正在访问带有指向错误端点的 WSDL 的第三方 SOAP API(第三方告诉我正确的端点但没有更新他们的 WSDL)。已接受的答案确实为我指明了正确的方向,但我想提供一些额外的细节,对于像我这样的新手开发者来说,这些细节并不明显。

首先注意到 Zeep's documentation 表明方法 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() 的参数中,因为它部分由 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 收集的信息。一个标题应该说“绑定”,然后是一个 binding_name 的列表(可能长度为 1)。您可以从那里复制您需要更改端点的那个。

选项 3 - 从 Zeep 客户端对象获取它

这感觉更像是一种黑客行为,但 list(zeep_client.wsdl.port_types) 给出了 Zeep 在用于创建 zeep_client 的 WSDL 中找到的所有绑定名称的列表。

找出address

最后,为了完整起见,address 只是您要使用的新端点,而不是 WSDL 中定义的端点。

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