Python使用requests库发POST请求下载PDF时报TypeError问题咨询
错误根因
你定义请求参数qdata时使用了大括号但没有配置键值对结构,实际生成的是**集合(set)**类型,而非requests.post的data参数要求的字典(dict)类型。requests无法正确序列化集合类型的请求参数,最终导致底层ssl发送数据时出现类型错误。
修复方案
先把请求参数修正为标准字典结构,请求成功后直接将二进制响应写入本地PDF文件即可,完整可运行代码如下:
import requests base_url = "https://homeland.my.salesforce.com" action = base_url + "/sfc/p/#1I000003o0lm/a/8W000001Dmtq/GT9FLcwrLX3QQjVDLCEonLxmCi6nG4VqCUJzDyK80GU" # 修正为字典结构,键值对匹配接口要求的参数 qdata = { "compositePageName": "1I000003o0lm/a/8W000001Dmtq/GT9FLcwrLX3QQjVDLCEonLxmCi6nG4VqCUJzDyK80GU" } # 发送POST请求,若接口需要身份认证可额外添加headers参数传入Cookie、Authorization等认证信息 req = requests.post(url=action, data=qdata, stream=True) # 校验请求成功后保存PDF if req.status_code == 200: with open("output.pdf", "wb") as f: for chunk in req.iter_content(chunk_size=1024): if chunk: f.write(chunk) print("PDF文件已成功保存为output.pdf") else: print(f"请求失败,状态码:{req.status_code},响应内容:{req.text}")
额外注意事项
- 如果目标接口需要身份认证,需要先调用登录接口获取有效Cookie,或者在请求头中添加
Authorization字段传入认证凭证,否则会返回401/403权限错误。 - 大体积PDF使用
stream=True+iter_content分片写入可以减少内存占用,小体积PDF也可以直接用f.write(req.content)一次性写入。
内容的提问来源于stack exchange,提问作者QuentinJS
相关产品推荐
相关产品推荐

