我目前正在研究实现一个将使用现有广泛的 SOAP 管理 API 的客户端。
我研究了不同的 SOAP 实现,例如 pysimplesoap 和 SUDS。虽然第一个由于递归过多而在解析 WSDL 时遇到问题,但 suds 工作得很好(但速度很慢)而且我真的很喜欢模块。
但是,SUDS 似乎存在一些问题,例如高内存消耗、WSDL 解析速度以及缺少对某些 WSDL 属性(例如选择属性)的支持。
虽然有很多人积极提交错误报告和补丁,自 2010 年 9 月 15 日的 0.4 起,有 no release 个 SUDS。此外,wiki 和路线图看起来有点被忽视。
对我来说,SUDS 似乎不再维护。
所以这里是我的问题:
将肥皂水作为肥皂客户建立更大的项目是否有意义?是否有一个 suds fork 已经实现了票务系统中的一些可用补丁?有哪些可用的替代方案,它们具有较低的内存占用、易于使用并且可以处理复杂的大型 WSDL 文件
[2013 年 11 月更新]
两年多过去了,原来的 suds 项目真的死了。自 2010 年以来没有进一步的版本。由于这个事实,很多人开始分叉 suds,并且像 Debian 这样的发行版正在部署原始 suds 软件包的补丁版本来解决一些问题。
我可以推荐我成功使用的 Jurko 积极维护的 fork。它支持 python 3 并解决了许多 suds 的已知问题。 Bitbucket 上提供了发行说明和错误跟踪器,PyPI 上也提供了该软件包,因此可以使用 pip 安装它。
pip install suds-community
虽然没有经过认证的标准,但如果您必须使用 SOAP,Suds 是您的最佳选择。在大型 WSDL 上,Suds 可能会很慢,而这正是他们正在努力解决的问题。
同时,如果您不希望您的 WSDL 经常更改,您有两个选项可以为您带来很多速度:
使用缓存将 WSDL 下载到本地主机
下载您的 WSDL
对于大型 WSDL,部分问题在于首先您必须每次都下载 WSDL,这会增加开销。 Suds 会在启动时花时间下载和解析整个 WSDL,以确保它没有改变。
如果您可以将其下载到本地系统,然后使用 URL 中的 file://
方案将其传递给 Client
构造函数。由于 Suds 使用 urllib2
进行 HTTP 传输,因此这是完全合法的。
现在,由于您没有在 WSDL URL 中提供主机名,因此您还必须传递一个 location
参数来指定 SOAP 应用程序的实际 URL。
这是一个例子:
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
参数将其传递给构造函数。否则,它默认为持续时间为 1 天的 ObjectCache
。
您也可以考虑使用这两种方法。
有一个新的维护良好的 SOAP 客户端,称为 zeep。它同时支持 Python 2 和 3,并且基于众所周知的 lxml 和 requests 库。
zeep
,因为他们在首页上的示例存在缺陷;第一印象。特别是从快速示例(在其他示例中重复)中,导入是 from zeep import Client
。然后在第 2 行 (client = zeep.Client(
) 会给你 NameError: name 'zeep' is not defined
。
可以在此处找到一篇有趣的最新帖子:What SOAP client libraries exist for Python, and where is the documentation for them? 不幸的是,您正在寻找的完美 SOAP 库似乎不存在(目前)
现在是 2013 年。对于像我一样遇到 Python 和 SOAP 问题的人来说,这是一个更新。
我试图在 Python 中使用 SOAP。我尝试了 suds,但遗憾的是,该库自 2010 年以来一直没有更新。在我的代码的第一次测试运行中,我收到了这个错误:
RuntimeError: maximum recursion depth exceeded while calling a Python object
事实证明这是 suds 对 HTTPS 连接的递归引用的一个问题。 See drfence's answer。我不得不手动修补泡沫来解决这个问题。
我改用php。不像python那么简单,但我能够让它工作。
不定期副业成功案例分享