Python requests上传文件返回200状态码但空JSON响应如何解决
问题原因
你的requests请求和成功的curl/Postman请求参数不一致,漏传了两个必填的表单字段,后端校验参数不通过所以返回空JSON。
对照你提供的curl命令,multipart/form-data里一共传了3个字段:
file:二进制文件本身fileName:文件名字符串fileType:文件MIME类型字符串
你写的Python代码只传了file字段,完全缺失fileName和fileType两个参数,后端拿不到完整的上传元信息,自然不会正常返回fileId。另外你的代码片段里还漏了HTTPBasicAuth的导入,也没指定Accept请求头告知服务端需要返回JSON格式。
修复代码
import requests from requests.auth import HTTPBasicAuth session = requests.session() # 上传的文件字段 with open('1.png', 'rb') as f: files = { 'file': ('1.png', f, 'image/png') } # 补充缺失的普通表单字段 form_params = { 'fileName': '1.png', 'fileType': 'image/png' } # 补充必要请求头,不要手动加Content-Type: multipart/form-data,requests会自动生成带正确boundary的头 headers = { 'Accept': 'application/json' } resp = session.post( url='http://someurl.com/api/file', auth=HTTPBasicAuth('my_login', 'my_password'), files=files, data=form_params, headers=headers ) print(resp.json())
避坑提示
- 绝对不要手动给上传请求写
Content-Type: multipart/form-data头:requests处理文件上传时会自动生成包含随机boundary的Content-Type头,手动写死的头缺少boundary参数,会直接导致服务端无法解析请求体 - 打开文件建议用
with上下文管理器,上传完成后会自动关闭文件句柄,避免资源泄漏 - 如果修复后还是异常,可以打印
resp.request.headers和resp.request.body,和curl的请求内容做逐字段对比,很快就能定位参数差异。
内容的提问来源于stack exchange,提问作者mulder8212
相关产品推荐
相关产品推荐

