S3静态网站调用API Gateway时Body Mapping Template不生效咨询
我之前也碰到过一模一样的坑!大概率是这几个配置环节没做好,你逐个排查下:
确认集成类型不是Lambda代理模式
这是最常见的原因!如果你的API Gateway用的是Lambda代理集成,自定义的Body Mapping Template是完全不会生效的——代理模式下API Gateway会把整个请求的原始上下文(包括headers、body、path参数等)直接打包传给Lambda,跳过所有映射模板配置。你需要把集成类型改成非代理集成(也就是普通的Lambda Function集成),映射模板才会起作用。检查映射模板的关联配置
确保你是在集成请求(不是方法请求)的Body Mapping Templates选项里配置的模板:- 进入对应API的方法页面,切换到「集成请求」标签
- 找到「Body Mapping Templates」,确认你要匹配的Content-Type(比如
application/json)已经被添加,并且模板内容正确 - 还要确认勾选了「当没有定义模板时通过请求体」或者直接指定了对应Content-Type的模板,不要留空或者没激活
验证前端请求的Content-Type与模板匹配
如果你的模板是针对application/json设置的,但前端发送请求时没有设置Content-Type: application/json头,API Gateway会找不到对应的模板,直接把原始body传给Lambda。你可以在浏览器开发者工具的Network面板里检查请求头,或者在前端代码里明确设置:
比如用axios的话:axios.post('/your-api-path', data, { headers: { 'Content-Type': 'application/json' } })确认API已经重新部署
很多人改完配置就忘了部署!每次修改集成请求或映射模板后,一定要回到API Gateway的「Actions」菜单选择「Deploy API」,把更新推到对应的阶段(比如prod/dev),不然你的修改根本不会生效,还是用的旧配置。测试模板的语法正确性
你可以用API Gateway的内置测试工具验证模板:- 在方法页面点击「测试」按钮
- 输入测试的请求体,切换到「Integration Request」标签下的「Body Mapping Template」预览
- 看看生成的请求体是否符合预期,比如你的模板应该输出包含
api_name、http-method和body的JSON结构。如果预览不对,检查模板里的变量是否拼写正确(比如$context.resourcePath有没有写错)
我当时就是因为不小心用了Lambda代理集成,折腾了大半天,改成非代理模式后模板立刻就生效了。你先排查代理模式这个点,大概率能解决问题!
内容的提问来源于stack exchange,提问作者Ludo

