如何将查询字符串值从AWS API Gateway传递到Lambda C#函数

3

我有一个C#方法,已经成功地发布为AWS Lambda函数。它看起来像这样:

public class MyClass
{
    public async Task<APIGatewayProxyResponse> Test(APIGatewayProxyRequest request, ILambdaContext context)
    {
        return new APIGatewayProxyResponse
        {
            Body = "Body: " + request.Body
                   + Environment.NewLine
                   + "Querystring: " + (request.QueryStringParameters == null ? "null" : string.Join(",", request.QueryStringParameters.Keys)),
            StatusCode = 200
        };
    }
}

我已经通过Web界面完成了以下操作,以配置我的API网关:
  1. 创建了一个新的API
  2. 创建了一个名为"myclass"且路径为"/myclass"的新资源
  3. 为该资源创建了一个新的GET方法,使用"Lambda函数"作为集成类型,并指向我的Lambda函数。
我希望能够像这样调用我的Lambda函数(在请求中不传递任何指定的标头):https://xxx.execute-api.us-east-2.amazonaws.com/prod/myclass?paramA=valueA&paramB=valueB 我不确定如何将我的查询字符串参数传递给Lambda函数。无论我尝试什么,request.QueryStringParameters始终为空。
请问下一步正确的操作是什么?
3个回答

4

您需要为请求配置 URL 查询字符串参数。

  1. go to API gateway

  2. click on your appropriate method i.e. GET method

  3. go to Method Execution

  4. In method execution , select URL Query String Parameter.

  5. Add query String parameter like paramA, paramB

  6. Now go to Integration Request Tab

  7. Choose Body Mapping Template, content type application/json

  8. Generate Template like below

    {
     "paramA":  "$input.params('paramA')",
     "paramB":  "$input.params('paramB')"
    }
    
  9. Accept this key value in pair in lamda function.

希望这对您有所帮助。


抱歉,那个不起作用:在Lambda函数内部,request.QueryStringParameters仍然为空。您之前尝试过使用C#吗? - cbp
1
这是正确的答案。顺便问一下,我该如何在lambda内部检查请求是POST还是GET? - Royi Namir
在AWS API的集成请求中,您可以使用“http_method”:“$context.httpMethod”。然后,您可以在AWS Lambda的事件中访问新属性。 - Vaibs

1

好的,我已经解决了问题。

APIGatewayProxyRequest是从传递给Lambda函数的JSON反序列化的对象。如果您将JObject作为第一个参数接受,可以查看传递给Lambda函数的原始JSON:

public async Task<APIGatewayProxyResponse> Test(JObject request, ILambdaContext context)
{
    return new APIGatewayProxyResponse
    {
        Body = request.ToString(),
        StatusCode = 200
    };
}

因此,为了填充APIGatewayProxyRequest,Body Mapping Template中指定的JSON需要与APIGatewayProxyRequest的属性匹配。这里展示了模式的示例(尽管它不显示您需要的实际模板):https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-input-format 但是,实际上并不需要使用APIGatewayProxyRequest。更容易的方法是将JObject作为Lambda函数的第一个参数接受,然后您就可以访问所需的任何JSON。然后,您可以使用类似于Vaibs答案中描述的技术。

0

请使用"$input.params('YourQueryStringKey')"。

您可以在API网关集成响应中创建一个body mapping模板,并尝试使用"$input.params('YourQueryStringKey')",或者直接在Lambda函数中使用。


嗨,那是我尝试过的其中一件事情 - 你能否更具体地说明我该如何在我的Body Mapping模板或Lambda函数中包含它? - cbp
请查看以下网址:https://aws.amazon.com/blogs/compute/using-api-gateway-mapping-templates-to-handle-changes-in-your-back-end-apis/ - Vijayanath Viswanathan
这个链接已经过时了 - 我相信 AWS 的界面在文章撰写后的 2016 年进行了更改。不幸的是,按照那些说明进行操作会导致同样的 NullReferenceException。 - cbp
哦,抱歉伙计。我会在今天某个时候完成并分享截图。 - Vijayanath Viswanathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接