如何用Python3的requests库向REST API发送大XML文件?
解决requests传递大XML文件对接REST API的问题
你的问题核心在于没有正确模拟curl命令的请求格式,我们来一步步拆解解决:
问题分析
你用的curl命令curl -k https://10.244.1.2:4444/webconsole/APIController? -F "reqxml=MYxml.xml"中,-F参数是告诉curl以multipart/form-data的表单格式发送请求,把reqxml作为表单字段,值为MYxml.xml文件的内容。
而你现在的Python代码犯了两个关键错误:
- 尝试把大XML拼接到URL的查询参数中:URL有明确的长度限制(不同服务器配置通常在几KB到几十KB之间),大XML肯定会超出这个限制,直接导致请求失效。
- 直接把XML内容作为
data参数发送:这会将XML作为raw请求体发送,和curl的表单请求格式完全不匹配,API无法正确识别你的参数。
正确的Python实现
我们需要用requests的files参数来模拟curl的-F行为,这样既符合API的预期格式,又能高效处理大文件(不需要一次性把整个XML读入内存):
推荐方式(高效处理大文件)
import requests # 注意:URL不需要拼接reqxml参数,表单字段会通过files传递 url = 'https://10.244.1.2:4444/webconsole/APIController' # 用with语句安全打开文件,requests会自动分块读取发送,避免内存溢出 with open('MYxml.xml', 'rb') as xml_file: # 构造表单字段:键是reqxml,值是文件对象 files = {'reqxml': xml_file} # 发送请求,verify=False忽略SSL验证(生产环境建议配置合法证书) response = requests.post(url, files=files, verify=False) print(response.text)
备选方式(读取文件内容后发送,适合小文件)
如果你需要先对XML内容做处理再发送,可以这样写:
import requests url = 'https://10.244.1.2:4444/webconsole/APIController' with open('MYxml.xml', 'r') as f: xml_content = f.read() # 构造带元信息的表单数据,明确指定文件名和内容类型 files = {'reqxml': ('MYxml.xml', xml_content, 'application/xml')} response = requests.post(url, files=files, verify=False) print(response.text)
额外说明
- 为什么用
files而不是data?因为-F对应的是multipart/form-data表单,files参数是requests专门用来模拟这种请求的;如果用data={'reqxml': xml_content},会发送application/x-www-form-urlencoded格式的表单,部分API可能不兼容。 - 生产环境请不要用
verify=False,建议下载并配置目标服务器的SSL证书,避免安全风险。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

