如何使用Python urllib3发送带附件的POST请求(Postman接口已验证)
urllib3 发送带附件POST请求修复方案
核心错误点
- 手动设置了
Content-Type: multipart/form-data请求头:urllib3处理fields参数时会自动生成带boundary边界标识的请求头,手动设置会缺失边界信息,服务端无法解析表单内容。 - 对payload做了JSON序列化:
fields参数要求传入原生字典结构,传入JSON字符串完全不符合multipart表单的格式要求。 - 嵌套参数格式错误:multipart表单不支持直接传递嵌套字典,嵌套字段需要用
父字段[子字段]的格式作为键名。 - 附件字段格式错误:urllib3传递文件时,对应字段需要使用
(文件名, 文件字节, MIME类型)的三元组格式,才能正确传递文件名和文件内容。 - 注意字段拼写检查:你代码中的
attchment少了一个字母e,请确认和API要求的字段名attachment是否一致,拼写错误会导致服务端识别不到附件参数。
修正后的可运行代码
import urllib3 api_key = "secret_key" # 移除手动设置的content-type,由urllib3自动生成 header = {"X-API-KEY": api_key, "ACCEPT": "application/json"} url = "https://secret_url.com/api/" http = urllib3.PoolManager() with open("invoice.html", 'rb') as f: file_data = f.read() # 嵌套字段用attachment[file]作为键名,文件传三元组格式 payload = { # 如果API要求的字段名确实是attchment(少e),请自行修改键名前缀 "attachment[file]": ("invoice.html", file_data, "text/html") } r = http.request('POST', url, headers=header, fields=payload) print(r.status) print(r.data)
额外说明
- 你之前移除附件参数后返回的401错误大概率是API的参数校验逻辑导致,不是X-API-KEY授权失效,正确传递附件参数即可解决。
- 如果需要在AWS Lambda中使用requests库,可以通过Lambda层(Layer)打包requests依赖上传使用,不需要强制使用urllib3。以上代码可以直接在Lambda默认Python运行环境中运行,不需要额外依赖。
内容的提问来源于stack exchange,提问作者Brodie
相关产品推荐
相关产品推荐

