在Python Zeep中更改服务URL

时间:2017-02-14 21:09:07

标签: python soap

我想使用Python Zeep SOAP客户端向Cisco CUCM发出SOAP调用。 在思科WSDL文件中,服务定义为:

<service name="AXLAPIService">
    <port binding="s0:AXLAPIBinding" name="AXLPort">
        <soap:address location="https://CCMSERVERNAME:8443/axl/"/>
    </port>
</service>

现在我要更改&#34; CCMSERVERNAME&#34;真实的东西,如&#34; 192.168.250.10&#34;不改变WSDL。

但是从Docs我找不到任何改变它的东西。

我在这里找到了一个关于用&#34; Client.set_address()&#34;更改URL的讨论。但是这不再适用了。

有人可以给我一个暗示吗?

编辑: 有了mvt的帮助,我得到了它,对于任何有同样问题的人,用这个命令创建服务:

service = client.create_service("  {http://www.cisco.com/AXLAPIService/}AXLAPIBinding","https://192.168.250.10:8443/axl/")

这是一个有效的SOAP调用示例:

phones = service.listPhone({'devicePoolName':'Default'},returnedTags={'name':'','model':''})

返回列表中的设备:

SEPFFFFFFFFFFAA Cisco 7841
SEPAAAABBBB2222 Cisco 7841

3 个答案:

答案 0 :(得分:11)

这应该可以通过http://docs.python-zeep.org/en/master/client.html#creating-new-serviceproxy-objects

来实现

干杯(zeep的作者)

答案 1 :(得分:2)

对于内部服务器上的端点,无法通过Internet访问,端口转发端口80使用ssh到localhost:8080我制作了以下代码段,它复制服务绑定并将转换应用于绑定地址以创建新服务。

def get_service(client, translation)
    if translation:
        service_binding = client.service._binding.name
        service_address = client.service._binding_options['address']
        return client.create_service(
            service_binding,
            service_address.replace(*translation, 1)
    else:
        return client.service

# ssh port forwarded internal.example.com:80 to localhost:8080

client = zeep.Client(wsdl="localhost:8080/endpoint?WSDL")

# client.service now points to the unreachable url internal.example.com/endpoint

service = get_service(client=client, translation=('internal.example.com', 'localhost:8080'))

# service now points to localhost:8080/endpoint

答案 2 :(得分:1)

另一个快速的技巧可能是

client.service._binding_options["address"] = your_url