簡體   English   中英

Python SOAP客戶端 - 使用SUDS還是其他什么?

[英]Python SOAP Client - use SUDS or something else?

我目前正在研究實現一個將使用現有廣泛的SOAP管理API的客戶端。

我研究了不同的SOAP實現,如pysimplesoapSUDS 雖然第一個因為遞歸太多而解析WSDL時遇到問題,但suds工作得很好(但很慢)而且我真的很喜歡模塊。

但是,SUDS似乎存在一些問題,例如高內存消耗,WSDL解析速度以及缺少對某些WSDL屬性的支持(例如,選擇屬性)。
雖然有很多人積極提交錯誤報告和補丁,但自2010-09-15以來沒有發布過SUDS。 此外,維基和路線圖看起來有點被忽視。

對我來說,看起來SUDS已不再維護。

所以我的問題在這里:

  1. 作為肥皂客戶,將更大的項目作為suds是否有意義?
  2. 是否有一個suds fork已經實現了票務系統中可用的一些補丁?
  3. 有哪些替代方案,內存占用少,易於使用,可以處理復雜的大型WSDL文件

[2013年11月更新]

兩年多過去了,事實證明原來的肥皂水泥項目真的已經死了。 自2010年以來,沒有進一步的版本。由於這一事實,很多人開始分支suds,而像Debian這樣的發行版正在部署原始suds包的修補版本來修復一些問題。

我可以推薦Jurko積極維護的叉子,我成功使用了它。 它支持python 3並解決了很多泡沫已知的問題。 Bitbucket上提供了發行說明和錯誤跟蹤器, PyPI上也提供了該程序包,因此可以使用pip進行安裝。

雖然沒有經過認證的標准,但如果必須使用SOAP,則Suds是您的最佳選擇。 大型WSDL上的延遲可能很慢,而這正是他們正在努力的事情。

與此同時,如果您不希望WSDL經常更改,您有兩個選項可以為您帶來很多速度:

  1. 將WSDL下載到localhost
  2. 使用緩存

下載您的WSDL

對於大型WSDL,問題的一部分是首先必須每次都下載WSDL,這會增加開銷。 Suds將花時間在啟動時下載並解析整個WSDL,以確保它沒有更改。

如果可以將其下載到本地系統,然后使用URL中的file:// scheme將其傳遞給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)

如果您有興趣,我已經在我的工作中使用了這種方法並且已經開源代碼

緩存您的WSDL

另一種選擇是使用Suds 出色的緩存功能 您必須顯式創建一個緩存對象,然后使用cache參數將其傳遞給構造函數。 否則,它默認為持續時間為1天的ObjectCache

您也可以考慮使用這兩種方法。

有一個名為zeep的新維護良好的SOAP客戶端。 它支持Python 2和3,並基於眾所周知的lxml和請求庫。

可以在這里找到一個有趣的最新帖子: Python存在哪些SOAP客戶端庫,它們的文檔在哪里? 不幸的是,你正在尋找的完美的SOAP庫似乎不存在(還)

這是2013年。對於像我這樣遇到Python和SOAP問題的人來說,這是一個更新。

我試圖在Python中使用SOAP。 我試過suds,但遺憾的是自2010年以來該庫尚未更新。在我的代碼的第一次測試中,我收到了這個錯誤:

RuntimeError: maximum recursion depth exceeded while calling a Python object

結果是suds與HTTPS連接上的遞歸引用有關的問題。 見drfence的回答 我不得不手動修補肥皂以解決這個問題。

我轉而使用php。 不像python那么簡單,但我能夠讓它工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM