使用requests POST上传文件返回422,等效curl可正常运行如何解决
问题排查与修复方案
- 最常见的错误是文件上传字段缺少显式文件名与MIME类型声明。curl执行
--form file='@example_files/ex1.pdf'时会自动将本地文件名ex1.pdf和对应的PDF类型附带在multipart/form-data请求的file字段中,你当前的requests写法仅传入了文件二进制流,很多后端接口会校验上传文件的文件名,缺失该参数就会返回422语义错误。
修正后的files参数写法如下:# 元组参数依次为:文件名、文件对象、MIME类型 f = {'file': ('ex1.pdf', open("example_files/ex1.pdf", "rb"), 'application/pdf')} - 检查是否手动添加了
Content-Type: multipart/form-data请求头。使用requests的files参数时,库会自动生成带boundary分隔符的Content-Type头,如果你手动指定了该头却没有补充正确的boundary参数,会导致后端无法解析表单数据,返回422错误。你当前给出的header配置中没有该字段,如果实际运行代码里加了请直接删除。 - 校验密钥与路径正确性:确认代码中
<KEY>对应的实际值和curl中使用的完全一致,没有多余的空格、换行符;确认Python脚本运行的工作目录和curl执行目录一致,example_files/ex1.pdf路径有效、文件可正常读取。 - 如果需要进一步排查差异,可以打印请求完整内容和curl的
-v输出对比:import requests from requests_toolbelt.utils import dump header = { "Accept": "application/json", "X-Hermes-Key": "替换为你的实际密钥" } f = {'file': ('ex1.pdf', open("example_files/ex1.pdf", "rb"), 'application/pdf')} r_create = requests.post(url="替换为你的实际请求地址", headers=header, files=f) # 打印完整请求日志 data = dump.dump_all(r_create) print(data.decode('utf-8'))
内容的提问来源于stack exchange,提问作者Henry Gilbert
相关产品推荐
相关产品推荐

