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

Django中向SOAP请求发送对象列表报错,求解决方案

解决Django中向SOAP发送对象列表请求的错误

错误根源

你犯了两个核心问题:

  1. 用f"""{data}"""把Python列表转成字符串传递,SOAP服务无法解析这种字符串形式的数组。
  2. 请求参数结构不符合WSDL定义:服务端期望接收单个DocLossFile对象,但你传递了数组;或者你误解了参数层级,应该把列表包裹在某个对象属性中。

解决步骤

1. 先明确WSDL的参数定义

用zeep工具查看服务方法的参数结构,确认AddDocLossFile的参数要求:

from zeep import Client

wsdl = 'http://test.com/Test/TEST.asmx?wsdl'
client = Client(wsdl=wsdl)

# 打印方法签名,查看参数类型
print(client.service.AddDocLossFile)
# 或者查看完整WSDL结构
client.wsdl.dump()

2. 构造符合要求的请求数据

根据WSDL的定义,分三种情况处理:

情况一:request参数需要接收**DocLossFile对象列表**

用zeep的get_type方法创建对应类型的对象,再组成列表传递:

data = [{"title": "title1", "pic": "pic1"},
        {"title": "title2", "pic": "pic2"}]

client = Client(wsdl=wsdl)
# 获取DocLossFile类型(命名空间ns0需根据WSDL实际调整)
DocLossFile = client.get_type('ns0:DocLossFile')
# 把字典转成SOAP要求的对象
doc_list = [DocLossFile(**item) for item in data]

tac_data = {
    'user': {'UserName': 'username', 'Pass': 'password'},
    'request': doc_list  # 直接传递对象列表
}

response = client.service.AddDocLossFile(**tac_data)
情况二:request参数是包含文件列表的包装对象

如果WSDL定义request是一个包含文件列表属性的对象(比如DocLossFileRequest,其中有Files属性存储列表):

client = Client(wsdl=wsdl)
# 获取包装对象类型和文件对象类型
DocLossFile = client.get_type('ns0:DocLossFile')
DocLossFileRequest = client.get_type('ns0:DocLossFileRequest')

doc_list = [DocLossFile(**item) for item in data]
# 构造包装对象,把列表放到指定属性中
request_obj = DocLossFileRequest(Files=doc_list)

tac_data = {
    'user': {'UserName': 'username', 'Pass': 'password'},
    'request': request_obj
}

response = client.service.AddDocLossFile(**tac_data)
情况三:request参数仅接收单个DocLossFile对象

这种情况说明你原本的列表是错误的,应该传递单个对象:

# 取单个数据项
single_data = {"title": "title1", "pic": "pic1"}

client = Client(wsdl=wsdl)
DocLossFile = client.get_type('ns0:DocLossFile')
request_obj = DocLossFile(**single_data)

tac_data = {
    'user': {'UserName': 'username', 'Pass': 'password'},
    'request': request_obj
}

response = client.service.AddDocLossFile(**tac_data)

关键注意点

  • 绝对不要用字符串格式化处理列表数据,SOAP需要结构化的对象/列表,而非字符串形式的数组。
  • 必须严格匹配WSDL定义的参数类型和结构,命名空间(比如ns0)要和WSDL中的一致。

内容的提问来源于stack exchange,提问作者Fereshteh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:48:25