AWS API Gateway同时传二进制和字符串参数的mapping模板配置问题
问题原因
你出现报错和参数为空的核心原因是:同时传输二进制文件和文本参数时,请求格式为multipart/form-data,而你之前用的$input.params()只能获取URL参数、请求头和application/x-www-form-urlencoded格式的表单参数,无法解析multipart请求中的分段内容,因此要么JSON格式错误报错,要么取不到参数返回空。
解决步骤
前置配置
- 进入对应API Gateway的「设置」页面,在「二进制媒体类型」中添加
multipart/form-data以及你上传的二进制文件对应的MIME类型(比如image/jpeg、image/png),保存配置。 - 确认你的POST请求的Integration Request页面下,「请求正文 passthrough」设置为「当没有定义模板时,传递请求正文 (WHEN_NO_TEMPLATE)」。
正确Mapping模板配置
在Integration Request的「映射模板」部分,添加Content-Type为multipart/form-data的模板,模板内容如下:
#set($formParts = {}) #foreach($part in $input.path('$.multipart')) #if($part.name == "imageFile") ## 二进制文件内容做Base64编码避免JSON格式错误 $util.qr($formParts.put($part.name, $util.base64Encode($part.content))) #else ## 文本类型参数直接读取内容 $util.qr($formParts.put($part.name, $part.content.toString())) #end #end { "imageFile": "$!formParts.get('imageFile')", "purdueUsername": "$!formParts.get('purdueUsername')", "description": "$!formParts.get('description')", "price": "$!formParts.get('price')", "longitude": "$!formParts.get('longitude')", "latitude": "$!formParts.get('latitude')", "category": "$!formParts.get('category')" }
注意事项
- 后端服务接收到
imageFile参数后,需要先做Base64解码才能得到原始二进制文件内容。 - 提交请求时,所有表单字段的
name属性需要和模板中取值的字段名完全一致,文件上传字段的name必须为imageFile。 - 模板修改完成后必须重新部署对应的API阶段,新配置才会生效。
内容的提问来源于stack exchange,提问作者buildingsomethingeveryday123
相关产品推荐
相关产品推荐

