You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:54:03