如何在Zeep中正确传递字符串数组?解决LookupError问题
如何在Zeep中正确传递SOAP字符串数组?
问题场景
需要在SOAP请求中传递字符串数组,目标SOAP信封结构如下:
<apiKey xsi:type="xsd:string">Ab12-Ab12-Ab12-Ab12</apiKey> <baseScheduleRollout xsi:type="flex:baseScheduleRollout" xmlns:flex="http://app.quinyx.com/soap/FlexForce"> <badgeNos xsi:type="flex:ArrayOfString" soapenc:arrayType="xsd:string[]"> <item1>1022</item1> <item2>1030</item2> <item3>10112330</item3> </badgeNos> <fromDateTime xsi:type="xsd:dateTime">2020-11-05T00:00:00</fromDateTime> <toDateTime xsi:type="xsd:dateTime">2020-11-24T00:00:00</toDateTime> </baseScheduleRollout>
已掌握SOAP请求发送方法,复杂类型配置无误,但字符串数组传递失败,尝试anyObject未解决,当前代码如下:
from zeep import Client from zeep import xsd import datetime from requests import Session from requests.auth import HTTPBasicAuth from zeep.transports import Transport wsdl = "https://api.quinyx.com/FlexForceWebServices.php?wsdl" session = Session() session.auth = HTTPBasicAuth('username', 'password') client = Client(wsdl, transport=Transport(session=session)) ArrayOfString = client.get_element('ns0:ArrayOfObject') badgeNo = ArrayOfString(['146223']) data = { "apiKey" : "apikey" , "baseScheduleRollout" :{ "badgeNos":badgeNo, "fromDateTime":xsd.SkipValue, "toDateTime":xsd.SkipValue } } result = client.service.wsdlGetBaseScheduleRolledoutHours(**data) result
运行后报错:
LookupError: No element 'ArrayOfObject' in namespace https://api.quinyx.com/soap/FlexForce. Available elements are: -
解决方案
错误根源
你错误引用了不存在的ArrayOfObject元素,WSDL中定义的字符串数组类型是ArrayOfString,同时要确保命名空间匹配。
修正代码(两种方式)
方式1:手动构建ArrayOfString对象
先确认命名空间前缀(可通过print(client.namespaces)查看,通常对应http://app.quinyx.com/soap/FlexForce的前缀是ns或flex):
from zeep import Client from zeep import xsd from requests import Session from requests.auth import HTTPBasicAuth from zeep.transports import Transport wsdl = "https://api.quinyx.com/FlexForceWebServices.php?wsdl" session = Session() session.auth = HTTPBasicAuth('username', 'password') client = Client(wsdl, transport=Transport(session=session)) # 获取正确的ArrayOfString元素,替换ns为实际命名空间前缀 ArrayOfString = client.get_element('ns:ArrayOfString') badgeNos = ArrayOfString(['146223', '1022', '1030']) data = { "apiKey": "apikey", "baseScheduleRollout": { "badgeNos": badgeNos, "fromDateTime": xsd.SkipValue, "toDateTime": xsd.SkipValue } } result = client.service.wsdlGetBaseScheduleRolledoutHours(**data) print(result)
方式2:直接传递Python列表(推荐)
Zeep会自动将Python列表映射为对应的SOAP数组类型,无需手动构建对象:
from zeep import Client from zeep import xsd from requests import Session from requests.auth import HTTPBasicAuth from zeep.transports import Transport wsdl = "https://api.quinyx.com/FlexForceWebServices.php?wsdl" session = Session() session.auth = HTTPBasicAuth('username', 'password') client = Client(wsdl, transport=Transport(session=session)) # 直接传Python列表即可 badgeNos = ['146223', '1022', '1030'] data = { "apiKey": "apikey", "baseScheduleRollout": { "badgeNos": badgeNos, "fromDateTime": xsd.SkipValue, "toDateTime": xsd.SkipValue } } result = client.service.wsdlGetBaseScheduleRolledoutHours(**data) print(result)
关键说明
- 执行
print(client.namespaces)可以查看所有可用命名空间,确保ArrayOfString的前缀正确 - Zeep对常见SOAP类型有自动映射,优先使用原生Python类型(如列表)简化代码
内容的提问来源于stack exchange,提问作者Shu Rahman
相关产品推荐
相关产品推荐

