我正在尝试使用此解决方案将我的Api-Gateway地图应用程序/ x-www-form-urlencode编码为json:
How to pass a params from POST to AWS Lambda from Amazon API Gateway
但是到目前为止,我的lambda成功仅触发了我的request.body始终为null。如果有人知道如何使用.net-core c#处理该问题,我将非常感谢您的见解。
到目前为止,这是我的无服务器lambda函数的外观,我收到时间戳,但与request.body无关。
public async Task<APIGatewayProxyResponse> Post(APIGatewayProxyRequest request, ILambdaContext context)
{
var webHook = new WebHookClient("https://{urlHiddenForObviousReasons}");
var body = new BodyModel
{
Content = $"Trigger @ {DateTime.UtcNow}, {request.Body}"
};
await webHook.PostMessage(body);
var response = new APIGatewayProxyResponse
{
StatusCode = (int)HttpStatusCode.OK,
Body = "Alert received.",
Headers = new Dictionary<string, string> { { "Content-Type", "text/plain" } }
};
return response;
}
请注意,如果我使用代理集成而不是传递表单值,则我想使用映射,这样我可以让两个客户端使用具有相同post方法的相同api并让lambda仅解析json。最终以这种方式传递表单值的设置示例:key = 1&steamid = 1&notetitle = ARK-ALARM%3A + 06%2F17 +%40 + 16%3A24 + on + Paleolithic + Ark +-+ The + Island%2C + ALARM + 'Base'+ IN +'The + Hidden + Lake'+ WAS + TRIPPED!&message = ...
最佳答案
您需要添加Mapping Template。
例如:
{
"name" : "$input.params('name')",
"body" : $input.json('$')
}
将其添加到POST方法的“集成请求”部分。
一个很好的例子也是here。
对我有用的另一个更复杂的示例:
#set($allParams = $input.params())
{
"body-json" : $input.json('$'),
"params" : {
#foreach($type in $allParams.keySet())
#set($params = $allParams.get($type))
"$type" : {
#foreach($paramName in $params.keySet())
"$paramName" : "$util.escapeJavaScript($params.get($paramName))"
#if($foreach.hasNext),#end
#end
}
#if($foreach.hasNext),#end
#end
}
}
我无法对C#代码发表评论,因为我已经习惯了Javascript和Python,但看起来还不错。