You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:03:12