Django中向SOAP请求发送对象列表报错,求解决方案
解决Django中向SOAP发送对象列表请求的错误
错误根源
你犯了两个核心问题:
- 用
f"""{data}"""把Python列表转成字符串传递,SOAP服务无法解析这种字符串形式的数组。 - 请求参数结构不符合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
相关产品推荐
相关产品推荐

