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

时间:2018-01-03 19:19:17

标签: amazon-web-services lambda aws-api-gateway

我目前正在尝试创建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函数?

由于

1 个答案:

答案 0 :(得分:0)

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

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

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

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

RowEditEnding