zeep构造SOAP服务tMensajeEjecucionConsulta参数时Parametros报错问询
问题原因
该错误由Python常用SOAP客户端Zeep对WSDL中choice联合类型的解析限制导致:
你传入的Parametros是数组类型,每个数组元素为4种可选结构(Txt/Num/Fec/Ses)的choice联合类型,Zeep无法自动识别普通字典对应的choice分支,因此会将字典的key识别为非法参数抛出异常。
解决方案
方案1:显式构造对应类型实例(推荐)
先通过WSDL获取每个可选参数的类型定义,再构造实例传入数组即可:
# 第一步:获取参数结构对应的类型定义,如类型名不匹配可打印client.wsdl.types查看全量类型 TxtType = client.get_type('ns0:Txt') FecType = client.get_type('ns0:Fec') # 第二步:构造请求 MensajeType = client.get_type('ns0:tMensajeEjecucionConsulta') req_data = MensajeType( CodConsulta={'v': '5473'}, Parametros=[ TxtType(n='Agente', v='Test'), FecType(n='Fecha', v='2021-10-28') ] ) # 第三步:调用接口 response = client.service.ServicioEjecucionConsultaEncolumnada(req_data)
方案2:跳过类型校验快速适配
如果无法找到对应类型的定义名,可以使用Zeep的xsd.AnyObject构造参数,跳过自动类型校验:
from zeep import xsd MensajeType = client.get_type('ns0:tMensajeEjecucionConsulta') req_data = MensajeType( CodConsulta={'v': '5473'}, Parametros=[ xsd.AnyObject( xsd.Element('Txt', xsd.ComplexType([ xsd.Element('n', xsd.String()), xsd.Element('v', xsd.String()) ])), {'n': 'Agente', 'v': 'Test'} ), xsd.AnyObject( xsd.Element('Fec', xsd.ComplexType([ xsd.Element('n', xsd.String()), xsd.Element('v', xsd.Date()) ])), {'n': 'Fecha', 'v': '2021-10-28'} ) ] ) response = client.service.ServicioEjecucionConsultaEncolumnada(req_data)
内容的提问来源于stack exchange,提问作者Andre Garcia
相关产品推荐
相关产品推荐

