首页 > 技术文章 > webservice 传入 Array 类型一直接收不到 问题记录

JanSN 2019-09-06 16:47 原文

原创博文 转载请注明出处!

今天一个下午都被一个问题浪费了时间,所以在这里记录下来

# 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

推荐阅读