Postman生成的Python requests POST代码下载zip文件内容错误求解
解决方案
下面是可直接落地的修正步骤和代码:
1. 修正参数语法错误
你提供的原始代码存在明显的语法问题,payload中的output字段数组未闭合、字典结尾符号错误,会直接导致请求参数传参异常,先按接口要求修正参数结构,示例如下:
payload = { 'api_key': 'XXXXXXXXXX', 'mode': 'low', # 若接口要求嵌套数组结构则写为 'output': ['Excel', ['Text']],确保括号正确闭合即可 'output': ['Excel', 'Text'] }
2. 补充必要请求头
Postman发送请求时会自动携带适配响应类型的请求头,代码中缺失Accept头可能导致接口返回错误信息而非zip二进制流,补充头配置:
headers = { 'Accept': 'application/zip' }
3. 增加请求结果校验
原代码未判断请求是否成功,直接写入内容大概率会把接口返回的错误信息(如参数错误的JSON文本)写入zip文件,导致文件无效。添加响应校验逻辑:
- 调用
response.raise_for_status()主动抛出4xx/5xx类请求异常 - 可打印响应头的
Content-Type字段确认返回的是zip类型:正常应该为application/zip或application/octet-stream
4. 规范文件资源操作
上传的Excel文件需要确保读取完整且资源正常释放,使用with语句管理文件句柄更安全。
修正后完整代码
import requests url = 'https://myapi.url/goes-here' payload = { 'api_key': 'XXXXXXXXXX', 'mode': 'low', 'output': ['Excel', 'Text'] } # 用with管理上传文件的句柄 with open('/Users/myuser/Documents/project/myfile.xlsx', 'rb') as f: files = [ ('file', ('myfile.xlsx', f, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')) ] headers = { 'Accept': 'application/zip' } response = requests.post(url, headers=headers, data=payload, files=files) # 先校验请求是否成功 response.raise_for_status() # 可选校验返回类型是否为zip print(response.headers.get('Content-Type')) # 写入文件 with open('my-file.zip', 'wb') as f: f.write(response.content)
如果修正后还是有问题,可打印response.content[:10]查看返回内容开头:正常zip文件的二进制开头为b'PK\x03\x04',如果不是这个内容,说明接口返回的是错误信息,需核对接口要求的传参格式是否和你提交的一致。
内容的提问来源于stack exchange,提问作者Mohsin Saeed
相关产品推荐
相关产品推荐

