webservice 传入 Array 类型一直接收不到 问题记录
原创博文 转载请注明出处!
今天一个下午都被一个问题浪费了时间,所以在这里记录下来
# server code
@srpc(RackType, Array(ComponentType), _returns=ReturnResult)
def AddRackComponents(rackinfo, componentlis):
logger.info('\nrack_info:{}'.format(rackinfo))
logger.info('\componentlis:{}'.format(componentlis))
for comp in componentlis:
logger.info('\ncomponent_lis:\n{}'.format(comp))
return ReturnResult(
result=True,
msg=''
)
# client
rack_info = { # RackType
'operatorid': '123',
'locationid': 1,
'serialnumber': '1',
'partnumber': '2',
'modelname': '3',
'stage': '4',
'mo': '5',
}
component_lis = []
for comp in range(0, 3):
component_info = { # ComponentType
'location': '3',
'serialnumber': '4',
'partnumber': '345',
'modelname': '345',
'stage': '345',
'category': '345',
}
component_lis.append(component_info)
print('component_lis:\n', component_lis)
ws = zeep.Client(wsdl=url)
res = ws.service.AddRackComponents(rack_info, component_lis)
print(res)
一开始 code 这样写,出现的问题是 logger 抓到的 component_lis 数据一直都是空
后台换了各种方法都抓不到数据,把 Array(ComponentType)
换成 Array(String)
client 传 String 列表也抓不到数据,只抓到空列表。
反正差不多要崩溃了,官方文档也没找到想要的答案
不过其实也能看出来问题在哪。
在 print('component_lis:\n', component_lis)
这里打印出来的东西表示传过去列表不是空,但是到了 webservice server 端就只收到了空列表,而换成其他不为迭代类型的都能正常接收到,说明很大概率是传过来的方式不对。
不死心又去找答案,结果在度娘找到了想要的答案 ——》 link
传 Array 参数时需要对参数进行封装, 下面是 zeep 的方法,suds 请点击参考链接查看
ws = zeep.Client(wsdl=url)
fa = self.client.type_factory("ns0")
arr = fa.ComponentTypeArray(component_lis)
res = ws.service.AddRackComponents(rack_info, arr)
print(res)
需要注意的是 ComponentTypeArray
函数名根据 server 端而定。
- 本人 server 端参数为
Array(ComponentType)
所有函数名为ComponentTypeArray
- 如果不是迭代类型,比如
Array(String)
函数名为接口名_参数名+Type
即为AddRackComponents_component_lisType
参考:
Web Service 之 Python -- spyne
官方文档 Spyne Documentation
Python开发Webservice(SOAP)
Spyne example