0

我正在尝试用 Python 编写一个使用 WSDL 文件的简单 SOAP 客户端。我已经尝试过 pysimplesoap 和 SUDS,但由于各种原因,这两种方法都失败了。

from pysimplesoap.client import SoapClient

wsdl = "http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl"
client = SoapClient(wsdl=wsdl)

print client

pysimplesoap 客户端失败AttributeError: Tag not found: service (No elements found)

from SOAPpy import WSDL
wsdlFile = "http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl"
server = WSDL.Proxy(wsdlFile)

SOAPpy 客户端引发IndexError: list index out of range异常。

我是 SOAP 的新手,所以我猜我在某个地方犯了一个非常基本的错误。

4

1 回答 1

0

有泡沫:

添加

<wsdl:service name="DeviceService">
    <wsdl:port binding="tds:DeviceBinding" name="DevicePort"> 
    <soap:address location="http://localhost/onvif/device_service/"/> 
    </wsdl:port>
</wsdl:service> 

在 devicemgmt.wsdl 文件之间和结尾处。原始 wsdl 没有定义服务,这就是 suds 不满意的原因

剧本:

import suds
import os

SERVER_URL = 'http://<INSERT_YOUR_CAMERAS_IP_HERE>:80/device_service'
WSDL_URL='file:' + os.getcwd() + '/wsdl/devicemgmt.wsdl'
cli=suds.client.Client(WSDL_URL)
cli.set_options(location=SERVER_URL)
security =  suds.wsse.Security()
token =  suds.wsse.UsernameToken('<INSERT_YOUR_USERNAME>', '<INSERT_YOUR_PASSWORD>')
token.setnonce('<INSERT_YOUR_NONCE>') # token.setonce() didn't work for me
token.setcreated()
security.tokens.append(token)
cli.set_options(wsse=security)

res=cli.service.GetDeviceInformation()
print res

“print cli”不起作用,但没关系... wsdl 的位置是 ./wsdl/devicemgmt.wsdl 并且从 wsdl 引用的文件放置在同一位置(修复链接后)

于 2014-01-22T07:25:01.213 回答