Python SOAP 客户端 - 使用SUDS或其他什么?

2024-06-26 13:28:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在研究实现一个客户端,它将使用现有的扩展SOAP管理API。

我研究了不同的SOAP实现,比如pysimplesoapSUDS。虽然第一个在解析WSDL时由于太多的递归而遇到了问题,但是sud工作得很好(但速度很慢),我非常喜欢module。

然而,sud似乎存在一些问题,如高内存消耗、WSDL解析速度和缺少对某些WSDL属性(如choice属性)的支持。
虽然有很多人在积极提交错误报告和修补程序,但从2010年9月15日0.4开始就出现了no release泡沫。而且,wiki和路线图看起来有点被忽略了。

对我来说,肥皂水似乎不再被维护了。

我的问题是:

  1. 把一个更大的项目建立在sud上作为soap客户端有意义吗?
  2. 是否有一个suds fork已经实现了票务系统中可用的一些补丁?
  3. 有哪些替代方案可用,它们具有较低的内存占用,易于使用,并且可以处理复杂的大型WSDL文件

[2013年11月更新]

两年多过去了,原来的suds项目真的死了。自2010年以来,没有进一步的发布。由于这个事实,很多人开始使用sud,像Debian这样的发行版正在部署原始sud包的补丁版本来解决一些问题。

我可以推荐Jurko积极维护的叉子,我成功地使用了它。它支持python 3并解决了许多sud的已知问题。发行说明和bug tracker可以在Bitbucket上找到,包也可以在PyPI上找到,因此可以使用pip安装它。


Tags: 项目内存api客户端属性速度soapsuds
3条回答

虽然没有经过认证的标准,但如果你必须使用肥皂,肥皂水是你最好的选择。sud在大型wsdl上可能会很慢,而这正是它们正在研究的问题。

同时,如果您不希望WSDL经常更改,那么有两个选项可以为您提供很大的速度:

  1. 将WSDL下载到本地主机
  2. 使用缓存

下载您的WSDL

对于大型WSDL,问题的一部分是,首先必须每次下载WSDL,这会增加开销。sud在启动时需要花时间下载和解析整个WSDL,以确保它没有更改。

如果可以将其下载到本地系统,然后使用URL中的file://方案将其传递给Client构造函数。由于Suds使用urllib2作为HTTP传输,这是完全合法的。

现在,因为您没有在WSDL URL中提供主机名,所以还必须传递一个指定SOAP应用程序的实际URL的location参数。

下面是一个例子:

from suds.client import Client

# The service URL
soap_url = 'http://myapp.example.notreal/path/to/soap'

# The WSDL URL, we wont' use this but just illustrating for example. This 
# would be the file you download to your system and save as wsdl_file
wsdl_url = 'http://myapp.example.notreal/path/to/soap?wsdl' 

# The full path to the downloaded WSDL file on your local system
wsdl_file = '/path/to/myapp.wsdl'
wsdl_url = 'file://' + wsdl_file # Override original wsdl_url

client = Client(url=wsdl_url, location=soap_url)

如果你感兴趣的话,我已经在我的工作中使用了这种方法并且已经open sourced the code

缓存WSDL

另一种选择是使用Suds'excellent caching feature。必须显式创建缓存对象,然后使用cache参数将其传递给构造函数。否则它默认为ObjectCache,持续时间为1天。

您也可以考虑使用这两种方法。

一篇有趣的最新文章可以在这里找到:What SOAP client libraries exist for Python, and where is the documentation for them? 不幸的是,您正在寻找的完美SOAP库似乎还不存在

有一个新的维护良好的SOAP客户机,名为zeep。它同时支持Python2和3,并且基于众所周知的lxml和请求库。

相关问题 更多 >