使用SUDS测试WSDL

7 投票
3 回答
24832 浏览
提问于 2025-04-15 18:01

有没有人知道好的SUDS教程?我想在WSDL文件上进行测试,但找不到相关的信息。SUDS和SOAPy差别大吗?有人推荐用它来对WSDL文件中的功能进行简单测试吗?

我听说SOAPy在Python 2.6及以上版本中不再支持,这是真的吗?

我有一个WSDL文件,已经输入了:

from suds.client import Client

client = Client('http://10.51.54.50/ptz.wsdl')

client.service.GetNode()

我遇到了这个错误:

    in open
    response = self._open(req, data)
  File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib2.py", line 407, in _open
    '_open', req)
  File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib2.py", line 367, in  _call_chain
    result = func(*args)
  File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib2.py", line 1146, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib2.py", line 1121, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 111] Connection refused>

有没有人知道为什么会这样?

我可以通过浏览器连接到这个文件。我已经安装了所有的suds包。还需要其他的设置吗?

3 个回答

2

在我的情况下,这真是个愚蠢的错误(就像其他任何bug一样)。

我用来初始化我的服务的URL大概是这样的:

Uri httpUri = new Uri("http://localhost:8000/CalculatorService");

我可以从和服务在同一台机器上运行的Python客户端访问这个服务。我可以在本地和远程机器上用浏览器查看wsdl(Web服务描述语言)。但是,当我尝试从远程机器访问这个服务时,却出现了连接被拒绝的错误。奇怪的是,在wireshark这个工具中,我能看到服务把wsdl发回给了远程客户端。

在浪费了几个小时后,我启用了日志记录。

logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
logging.getLogger('suds.xsd.schema').setLevel(logging.DEBUG)
logging.getLogger('suds.wsdl').setLevel(logging.DEBUG)

日志显示suds(一个Python库)从服务器下载了wsdl,但之后它试图连接到localhost:8000。这就解释了连接被拒绝的错误。我只是把WCF服务器上的URI改成了:

Uri httpUri = new Uri("http://192.168.0.1:8000/CalculatorService");

这样就解决了我的问题。

2

“连接被拒绝”意味着服务器没有响应。你能在浏览器里或者用curl命令访问一下 http://10.51.54.50/ptz.wsdl 吗?如果不能,先确保SOAP服务正常运行,然后再试一次。

17

Suds使用起来非常简单。

from suds.client import Client

client = Client("http://example.com/foo.wsdl")
client.service.someMethod(someParameter)

someMethod是WSDL中描述的方法名称。

撰写回答