AWS API Gateway无法向Lambda函数传递JSON对象问题
问题解决方案
确认Lambda输入参数的解析逻辑
如果你用APIGatewayProxyRequest作为函数输入参数,API Gateway代理模式下传递的请求体是嵌套在body字段里的JSON字符串,必须手动反序列化才能拿到参数。检查代码里是否做了这一步:public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) { // 必须将request.Body反序列化为自定义实体类 var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; var input = JsonSerializer.Deserialize<ClubRequest>(request.Body, options); // 校验参数是否存在 if (input?.ClubId == 0) { // 参数缺失时的返回逻辑 return new APIGatewayProxyResponse { StatusCode = 400, Body = "Missing clubid parameter" }; } // 后续过滤查询逻辑 var data = await GetFilteredData(input.ClubId); return new APIGatewayProxyResponse { StatusCode = 200, Body = JsonSerializer.Serialize(data) }; } // 对应的实体类 public class ClubRequest { public int ClubId { get; set; } }注意:如果实体类属性名和JSON字段名大小写不一致(比如JSON是
clubid,C#是ClubId),一定要开启PropertyNameCaseInsensitive配置。检查API Gateway集成设置
- 如果用的是Lambda代理集成:确保集成请求的「代理集成」开关是打开的,这种模式下API Gateway会把请求包装成
APIGatewayProxyRequest格式传给Lambda,必须按上面的方式解析body字段。 - 如果不用代理集成:需要在集成请求的「映射模板」里添加
application/json的模板,内容写$input.json('$'),这样API Gateway会直接把客户端的原始请求体传给Lambda,此时函数可以直接接收自定义实体类作为输入参数。
- 如果用的是Lambda代理集成:确保集成请求的「代理集成」开关是打开的,这种模式下API Gateway会把请求包装成
修正测试请求格式
- Postman或客户端请求时,直接传原始JSON,不要嵌套包装:
同时必须设置请求头{"clubid":1000}Content-Type: application/json。 - API Gateway测试控制台用「API Gateway AWS Proxy」模板时,模板本身的格式是正确的,但要确保你没有手动修改成无效JSON(比如你尝试的
{ {"clubid":1000} }是语法错误,无法解析)。
- Postman或客户端请求时,直接传原始JSON,不要嵌套包装:
加日志排查实际请求内容
在Lambda函数里添加日志,打印完整的请求对象,去CloudWatch日志里查看实际收到的参数结构:context.Logger.LogInformation($"Raw request received: {JsonSerializer.Serialize(request)}");通过日志可以确认
body字段的内容是否正确,有没有出现转义错误或者参数缺失的情况。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

