从C#代码调用AWS Lambda时无法获取参数值的问题求助
解决API Gateway调用Lambda时参数无法传递的问题
问题出在API Gateway与Lambda的集成方式以及Lambda输入参数的解析逻辑不匹配上,下面分两种最常见的场景给出解决方案:
方案一:使用Lambda代理集成(推荐)
Lambda代理集成会将API Gateway的完整请求信息(包括请求体、Headers、查询参数等)封装成APIGatewayProxyRequest对象传递给Lambda,你需要在Lambda中解析请求体获取参数:
- 修改Lambda函数处理器,引入
Amazon.Lambda.APIGatewayEvents包,并调整输入类型:
using Amazon.Lambda.APIGatewayEvents; using Newtonsoft.Json; public class RequestParams { public int CompanyId { get; set; } public int ProjectId { get; set; } } public string FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) { // 从请求体解析JSON参数 RequestParams input = JsonConvert.DeserializeObject<RequestParams>(request.Body); Console.Write($"{input.CompanyId}/{input.ProjectId}"); if (input.CompanyId == 0) { Console.WriteLine("Required Param companyId is missing"); return "function execution aborted"; } // 执行后续逻辑 return ""; }
确保API Gateway配置为Lambda代理集成:
- 在API Gateway的对应方法中,进入「集成请求」
- 勾选「使用Lambda代理集成」,保存并重新部署API
调用端保持你第二种JSON请求的方式(已正确,无需修改):
HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.ExpectContinue = false; client.Timeout = TimeSpan.FromMinutes(15); var json = new JObject { { "CompanyId", companyId }, { "ProjectId", projectId } }; var content = new StringContent(json.ToString(), Encoding.UTF8, "application/json"); var response = client.PostAsync(awsGatewayUrl, content).Result;
方案二:使用非代理集成(需配置映射模板)
如果不想修改Lambda的输入类型,可以通过API Gateway的映射模板,将请求体字段直接映射到你的RequestParams对象:
- 在API Gateway的对应方法中,进入「集成请求」
- 取消「使用Lambda代理集成」
- 在「映射模板」部分,添加
application/json的模板,内容如下:
{ "CompanyId": "$input.json('$.CompanyId')", "ProjectId": "$input.json('$.ProjectId')" }
- 保存并重新部署API
- Lambda函数处理器保持你原有代码不变,调用端同样使用第二种JSON请求方式即可。
额外注意事项
- 如果调用端想用
FormUrlEncodedContent(表单格式)传递参数,需要在Lambda中从APIGatewayProxyRequest.Form集合中读取,而非解析请求体 - 确保
RequestParams类的属性名称与请求体中的字段名称完全一致(默认序列化规则大小写敏感)
内容的提问来源于stack exchange,提问作者maX
相关产品推荐
相关产品推荐

