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

问题描述 投票:0回答:2

我正在使用 ZEEP 发出 SOAP 请求,它很简单并且效果很好。

问题在于端点 URL(在 WSDL 中)不正确。

我可以通过直接编辑 WSDL 来解决问题,但这不可扩展。

我查看了有关创建服务代理的 ZEEP 文档,但我不理解它并且出现错误。以下是 WSDL 中包含错误 URL 的部分:

</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 做到这一点吗?

非常感谢任何帮助!

python-3.x soap zeep
2个回答
4
投票

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

首先注意Zeep 的文档 显示方法 zeep.Client.create_service() 有两个参数。

binding_name – 绑定的 QName

地址 – 端点的地址

弄清楚

binding_name

选项 1 - 通读 WSDL

binding_name
来自 WSDL 中的属性
binding
。问题是该属性的值通常包含对 WSDL 中其他位置的名称的引用,您必须在使用它创建自定义服务之前手动解析该名称。

在摘录自 OP 的 WSDL 的情况下,

binding
的值为
"xrx:DeviceConfigurationBinding"

<service name="DeviceConfigurationService">
    <port name="DeviceConfigurationPort" binding="xrx:DeviceConfigurationBinding">
        <soap:address location="http://localhost/webservices/office/device_configuration/1"/>
    </port>
</service>

虽然这是 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 收集的信息。一个标题应为“Bindings”,后跟一系列
binding_name
的列表(长度可能为 1)。从那里您可以复制需要更改端点的端点。

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

这感觉更像是一种 hack,但是

list(zeep_client.wsdl.port_types)
给出了 Zeep 在 WSDL 中找到的用于创建
zeep_client
的所有绑定名称的列表。

弄清楚

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')
© www.soinside.com 2019 - 2024. All rights reserved.