項目上要開發一個小工具,通過webservice接口實現配置下發,考慮到python的第三方庫對soap的良好支持,果斷決定用python來完成這一使命。
Python的支持webservice的第三方庫是suds,官網上給出了詳細用法說明,初始化如下
from suds.client import Client url = 'http://localhost:7080/webservices/WebServiceTestBean?wsdl' client = Client(url)
print client
打印后可見到wsdl文檔的所有方法和數據類型,調用具體方法的操作很簡單:
client.service.methodName()
然后就和調用普通函數一樣的傳參和使用函數提供的功能即可。
使用print client.last_received()函數可以看到收到的soap協議內容
但實際應用中,碰到了幾個問題:
1、wsdl文檔不是放在網絡服務端,或為了隱藏wsdl的遠程訪問地址,把wsdl文檔放在本地,對於本地,url處填寫的方式為(以放在C盤為例):
url='file:\\\c:\test.wsdl'
2、僅僅調用服務的方法是非常簡單,但實際應用中,所用到的方法參數往往非常復雜,有些是自定義的數據類型,類似於結構體,我用到的方法,更離譜的是結構體中還包含自定義數據類型的結構體。直接調用client.service.method來傳參數肯定是不行了,參數類型的問題就沒法解決。
怎么辦呢?suds提供了非常好的解決辦法,使用factory工廠對象來初始化對象實例。使用client.factory.create函數創建對象實例后,直接對實例的參數進行初始化。更詳細的說明需參考官方文檔,本人使用的代碼段貼出如下:
def structParamSetting(ParamID,ColumnParamID,RowID,ParamValue,OperType): ParamItem=client.factory.create('SetParamItem') GWParamValue=client.factory.create('ParamValue') GWParamValue.ParamID=ParamID GWParamValue.ColumnParamID=ColumnParamID GWParamValue.RowID=RowID GWParamValue.ParamValue=ParamValue ParamItem.OperType=OperType ParamItem.ValueInfo=GWParamValue return ParamItem
參數結構為ParamItem為自定義數據類型,其中包含ValueInfo和OperType兩個字段,ValueInfo又為GWParamValue自定義數據類型,其中包含ParamID,ColumnParamID,RowID,ParamValue這幾個字段。
使用factory完美解決了傳復雜參數的問題。
主要的難點在於這兩處,其他的都屬於邏輯和算法優化問題,此處不述。