Python的SOAP客户端 – 使用SUDS或其他东西?
我目前正在考虑实现一个将使用现有的广泛的SOAPpipe理API的客户端。
我研究了不同的SOAP实现,如pysimplesoap和SUDS 。 虽然第一个问题是因为recursion太多而parsingWSDL,但是泡沫很好(但是很慢),我真的很喜欢模块。
但是,SUDS似乎存在一些问题,如高内存消耗,WSDLparsing速度以及缺less对某些WSDL属性(例如select属性)的支持。
虽然有很多人积极提交错误报告和补丁,但自2010年9月15日以来, 没有发布 SUDS。 另外,维基和路线图看起来有点被忽视。
对我来说,看起来SUDS不再维护。
所以在这里我的问题:
- 肥皂客户基础上一个更大的泡沫项目是否有意义?
- 是否有泡沫分叉已经实现了售票系统中的一些补丁?
- 有什么替代方法可用,内存占用less,易于使用,可以处理复杂的大型WSDL文件
[2013年11月更新]
两年多的时间过去了,原来的泡沫项目真的已经死了。 自2010年以来,并没有进一步的发布。由于这个事实,许多人开始分叉,像Debian这样的发行版本正在部署修补版本的原始泡沫包来解决一些问题。
我可以推荐我成功使用Jurko的积极维护的叉子。 它支持python 3,解决了许多已知的问题。 发行说明和bug跟踪器在Bitbucket上可用,包上也可以在PyPI上使用,因此可以使用pip进行安装。
虽然没有authentication的标准,但如果您必须使用SOAP,Suds是您的最佳select。 对于大型的WSDLs,速度可能会很慢,而这正是他们正在处理的事情。
同时,如果您不希望WSDL频繁更改,则有两个选项可以为您提供很多速度:
- 将您的WSDL下载到本地主机
- 使用caching
下载你的WSDL
对于大型WSDL,部分问题是首先必须每次下载WSDL,这可能会增加开销。 Suds将花费时间在启动时下载和parsing整个WSDL,以确保它没有改变。
如果可以将其下载到本地系统,然后使用URL中的file://
scheme将其传递给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)
如果您有兴趣,我已经在工作中使用了这种方法,并且已经开源了代码 。
caching你的WSDL
另一种select是使用Suds的优秀cachingfunction 。 您必须显式创build一个caching对象,然后使用cache
参数将其传递给构造函数。 否则,它默认为一个持续时间为1天的ObjectCache
。
你也可以考虑使用这两种方法。
可以在这里find一个有趣的最新的post: 什么是SOAP客户端库的Python存在,他们的文档在哪里? 不幸的是,你正在寻找的完美的SOAP库似乎还不存在(还)
有一个新的维护良好的叫做zeep的 SOAP客户端。 它支持Python 2和3,并且基于众所周知的lxml和请求库。
这是2013年。这是所有遇到与我一样的Python和SOAP问题的人的更新。
我试图在Python中使用SOAP。 我尝试了泡沫,但可悲的是,自2010年以来,图书馆还没有更新。在我的代码的第一次testing运行中,我收到了这个错误:
RuntimeError: maximum recursion depth exceeded while calling a Python object
事实certificate,这是一个关于HTTPS连接的recursion引用的问题。 查看drfence的答案 。 我不得不手动补丁泡沫来解决这个问题。
我切换到PHP代替。 不像python那样直截了当,但我能够得到它的工作。