如何使用AWS API Gateway将URL参数传递给Lambda函数?

问题描述 投票:1回答:1

我目前正在尝试创建Hello World Lambda函数并通过API网关对其进行测试,因为我的目的是使用Lambda函数提供REST API。我有一个非常基本的函数处理程序,它接受一个整数并将其作为字符串输出:

     public string FunctionHandler(int input, ILambdaContext context)
    {
        return input.ToString();
    }

我已将此代码发布到AWS,它似乎有效。我使用AWS工具以及AWS控制台从Visual Studio测试了它。

我有一个API设置,其POST方法有一个名为“input”的资源参数。在创建方法时,我选择了Lambda Expression for Integration Type。

当我使用API​​测试屏幕测试它时,我总是收到JSON异常。这是输出:

{
"errorType": "JsonReaderException",
"errorMessage": "Unexpected character encountered while parsing value: {.   Path '', line 1, position 1.",
"stackTrace": [
"at Newtonsoft.Json.JsonTextReader.ReadNumberValue(ReadType readType)",
"at Newtonsoft.Json.JsonTextReader.ReadAsInt32()",
"at  Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, Boolean hasConverter)",
"at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)",
"at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)",
"at Newtonsoft.Json.JsonSerializer.Deserialize[T](JsonReader reader)",
"at lambda_method(Closure , Stream , Stream , ContextInfo )"
]
}

以下是记录的标题。它们显示了我为输入提供的值,在这种情况下为1:

Execution log for request test-request
Wed Jan 03 19:12:25 UTC 2018 : Starting execution for request: test-invoke-request
Wed Jan 03 19:12:25 UTC 2018 : HTTP Method: POST, Resource Path: /1
Wed Jan 03 19:12:25 UTC 2018 : Method request path: {input=1}
Wed Jan 03 19:12:25 UTC 2018 : Method request query string: {}
Wed Jan 03 19:12:25 UTC 2018 : Method request headers: {}

我真的不明白为什么我收到任何类型的JSON错误。当我通过控制台或Visual Studio进行测试时,我只需提供一个“1”。根本没有JSON格式。当我使用路径参数通过控制台进行测试时,它应该是一个像“mydomain.com/resource/1”这样的网址。它不应该解析它,但我相信它有充分的理由去尝试。

是否可以将路径参数传递给Lambda函数?

谢谢

amazon-web-services lambda aws-api-gateway
1个回答
0
投票

我相信我已经弄明白了。我注意到许多类似线程的人建议使用映射模板以我想要的任何格式发送数据或选择使用Lambda代理集成。这些建议中的任何一个都可以使用,但令人困惑的是如何使用C#SDK处理它。

FunctionHandler的第一个参数是一个包含请求体中json的JObject。如果您没有映射模板,并且未选择“使用Lambda代理集成”,则此选项将始终为空。我决定使用USe Lambda代理集成,因为它似乎提供了格式良好的JSON所需的所有细节。

需要注意的第二个重要事项是,已经有一个类可以用来自动反序列化json。它提供了路径参数,查询字符串,正文和标题作为您可以轻松访问的简单属性。这就是Amazon.Lambda.APIGatewayEvents.APIGatewayProxyRequest(您可能需要添加nuget包,因为它不是默认空模板的一部分)。

所以最后我的代码看起来像这样:

    public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)
    {

        context.Logger.LogLine("Get Request\n");
        var path = "none";
        if (request.PathParameters != null && request.PathParameters.Any())
        {
            path = request.PathParameters["input"];
        }
        var response = new APIGatewayProxyResponse
        {
            StatusCode = (int)HttpStatusCode.OK,
            Body = "Hello World. Here are is your path param: " + path,
            Headers = new Dictionary<string, string> { { "Content-Type", "application/json" }, { "Access-Control-Allow-Origin", "*" } }
        };
        return response;
    }
© www.soinside.com 2019 - 2024. All rights reserved.