API Gateway接收body为null求助:如何通过Fetch传递对象?
解决API Gateway接收POST请求Body为null的问题
你遇到的这个情况在API Gateway的使用中其实挺常见的,核心问题出在API Gateway的请求解析规则和前端请求细节的匹配上。当你直接传字符串'hello working'时,虽然Content-Type设为application/json,但API Gateway可能把它当作纯文本解析才正常;而传JSON序列化后的对象时,反而因为配置或请求细节的问题没被正确解析。我帮你梳理几个关键的排查和解决步骤:
1. 检查API Gateway的集成请求映射模板
这是最常见的问题根源,要确保API Gateway知道怎么正确解析JSON格式的请求体:
- 登录API Gateway控制台,找到你的目标API和对应的POST方法
- 切换到「集成请求」标签页,找到「请求体传递」区域
- 确认已经添加了
application/json的映射模板,模板内容必须是:
这个模板会告诉API Gateway把请求中的JSON body完整解析并传递给后端服务。如果没有这个模板,API Gateway可能会忽略JSON格式的请求体,导致后端收到null。{ "body": $input.json('$') }
2. 修正前端Fetch请求的细节
虽然你用了JSON.stringify(object),但要确保几个关键点:
- 你的
object必须是可被JSON序列化的有效JS对象:不能包含循环引用、函数、Symbol这类无法被序列化的内容,否则JSON.stringify会失败,最终发送的body可能是空字符串或者无效内容 - 严格匹配请求头和序列化逻辑:正确的请求写法应该是这样的:
// 先定义一个合法的JS对象 const requestData = { username: 'test', action: 'submit' }; fetch(myUrl, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', // 这个必须和API Gateway的配置完全匹配 }, body: JSON.stringify(requestData), // 必须转成标准JSON字符串 }) .then(res => res.json()) .catch(err => console.error('请求出错:', err));
3. 确认API Gateway已重新部署
很多人修改完配置后会忽略这一步:API Gateway的配置修改后,必须重新部署到对应的阶段(比如dev、prod)才能生效。修改完映射模板后,点击控制台顶部的「部署API」按钮,选择你的目标阶段完成部署。
4. 排查后端服务的解析逻辑
如果前面的配置都没问题,就要检查后端服务的处理逻辑:
- 比如如果是Lambda函数,要确保你是从
event.body字段获取请求体(而不是其他自定义字段) - 如果
event.body是Base64编码的,需要先解码(不过API Gateway在配置了正确的映射模板后,会自动帮你处理解码)
内容的提问来源于stack exchange,提问作者Red Baron
相关产品推荐
相关产品推荐

