ChatGPT解决这个技术问题 Extra ChatGPT

Python SOAP 客户端 - 使用 SUDS 还是其他?

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

我研究了不同的 SOAP 实现,例如 pysimplesoapSUDS。虽然第一个由于递归过多而在解析 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 安装它。

wiki 的更改主要是关于 2010 年发布的 0.4 版本(内部版本号和类似的东西)。在过去的 365 天里,一个贡献者大约有 11 次提交,其中大多数是非常小的更新(1-2 位置)。没有任何提交导致新版本
我们可以确认 circus 的上述评论:自 2010 年以来 original suds 没有新版本。但是 niekas 注意到维护了一个 suds fork:suds-jurko ;-)
自 2017 年 3 月起,Jurko confirmed 他不再维护它。 A fork of Jurko's fork 现在正在维护并发布到 PyPI:pip install suds-community

j
jathanism

虽然没有经过认证的标准,但如果您必须使用 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

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


好的,然后我会坚持使用泡沫并使用您暗示的方法。此外,我可能最终会得到一个修补版本的螺柱,以减少内存占用。
如果您选择分享,我期待看到最终结果! :)
c
chhantyal

有一个新的维护良好的 SOAP 客户端,称为 zeep。它同时支持 Python 2 和 3,并且基于众所周知的 lxml 和 requests 库。


我不确定我是否会使用 zeep,因为他们在首页上的示例存在缺陷;第一印象。特别是从快速示例(在其他示例中重复)中,导入是 from zeep import Client。然后在第 2 行 (client = zeep.Client() 会给你 NameError: name 'zeep' is not defined
哈哈,我正准备用那个更改发送 PR。你打败了我:)
在选择zeep之前我会小心。文档绝对糟糕,它无数次地给出“意外的关键字参数”。我尝试了原始请求模块和原始 XML 的 POST 调用,它可以工作。似乎 zeep 让我失望了。
C
Community

可以在此处找到一篇有趣的最新帖子:What SOAP client libraries exist for Python, and where is the documentation for them? 不幸的是,您正在寻找的完美 SOAP 库似乎不存在(目前)


我知道这个线程,这就是我最初偶然发现泡沫的方式。不管怎么说,还是要谢谢你。
另外,我不是在寻找一个完美的图书馆。我只需要决定是否要建立一个更大的项目,我将在接下来的半年里从事泡沫方面的工作。如果我必须修补库以使其工作。
C
Community

现在是 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那么简单,但我能够让它工作。


@niekas 谢谢。我会检查一下。
我在递归深度加载 NetSuite WSDL 时遇到了同样的问题。您需要最新的 JURKO SUDS 开发人员版本,它应该可以解决问题。 (在 bitbucket url 之前添加 https - 不能在评论中这样做) sudo pip install bitbucket.org/jurko/suds/get/tip.tar.gz#egg=suds