python通过webservice接口实现配置下发

时间:2021-09-10 02:54:05

项目上要开发一个小工具,通过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完美解决了传复杂参数的问题。

主要的难点在于这两处,其他的都属于逻辑和算法优化问题,此处不述。