如何用Python Requests向AWS发送multipart/form-data格式TSV文件?问题排查
Python Requests发送multipart/form-data到AWS的异常排查
问题现象
- VSCode运行Python代码时,请求根本没到AWS Gateway,网关查不到任何日志
- Postman按相同配置发请求,能到Gateway,但返回
"message": "Unsupported Media Type"错误,关联的Lambda也没日志
相关配置
Python代码
def main(): file_path = 'files/data.tsv' file_name = os.path.basename(file_path) multipart_data = MultipartEncoder( fields={ 'file': (file_name, open(file_path, 'rb'), 'text/tab-separated-values') } ) headers = { 'Content-Type': multipart_data.content_type, 'Singnature': SECRET_KEY } try: r = requests.post(ENDPOINT, headers=headers, data=multipart_data) except Exception as e: print(e)
Postman配置
- URL、请求头和Python代码完全一致
- 请求体用
form-data格式,key设为file,value选本地的data.tsv文件
AWS配置
- API Gateway的Binary media types已经设为
multipart/form-data
API Gateway集成请求模板
{ "headers": { #foreach( $name in $input.params().header.keySet() ) "$name" : "$util.escapeJavaScript( $input.params().header.get( $name ) )" #if($foreach.hasNext),#end #end }, "body": "$util.escapeJavaScript( $input.body ).replaceAll(\"\\'\",\"'\")" }
可能的问题原因
1. Python代码请求未到网关的原因
- ENDPOINT配置错误:检查
ENDPOINT变量是不是API Gateway的完整地址(比如https://xxx.execute-api.region.amazonaws.com/stage),有没有拼写错误,或者环境变量未正确加载 - 网络拦截:本地代理、防火墙、VPN可能挡住了请求,试试用
curl直接调用端点测试连通性 - 异常捕获不完整:代码只打印异常,但未输出响应状态码、内容等信息,可能请求发出去了但遇到DNS解析失败、SSL错误等问题,在
try块里加print(r.status_code, r.text)(如果请求能发送成功),或者把异常信息打印完整 - 依赖缺失:
MultipartEncoder来自requests-toolbelt库,未安装的话代码可能静默失败,确认是否已安装该库
2. Postman返回"Unsupported Media Type"的原因
- Gateway媒体类型匹配问题:虽然设了
multipart/form-data为二进制类型,但Postman发送的Content-Type是带边界的完整格式(比如multipart/form-data; boundary=----WebKitFormBoundaryxxx),Gateway可能未识别到这种带边界的格式,需确认集成请求是否针对完整的Content-Type配置了模板,而非仅multipart/form-data - 集成模板不适配二进制数据:当前模板是为JSON或文本类型设计的,
multipart/form-data作为二进制数据,$input.body会被编码为base64,直接用$util.escapeJavaScript处理会导致格式错误,需更换为适配二进制的模板,比如将body转为base64:{ "headers": { #foreach( $name in $input.params().header.keySet() ) "$name" : "$util.escapeJavaScript( $input.params().header.get( $name ) )" #if($foreach.hasNext),#end #end }, "body": "$util.base64Encode($input.body)" } - Gateway阶段配置未生效:检查部署的阶段是否启用了二进制支持,阶段里的"Binary Media Types"需与控制台配置一致,且修改后需重新部署才会生效
- Lambda集成配置错误:如果是HTTP集成到Lambda,需确认触发器的路径、HTTP方法是否正确,Lambda是否能处理
multipart/form-data格式的输入,Gateway是否正确将请求转发到Lambda
内容的提问来源于stack exchange,提问作者上嶋光優
相关产品推荐
相关产品推荐

