【问题标题】:How to map querystring and header to AWS C# lambda function parameter如何将查询字符串和标头映射到 AWS C# lambda 函数参数
【发布时间】:2019-05-26 15:47:38
【问题描述】:

我有带有 2 个查询字符串参数的 AWS Gateway REST API

https://xxxxxx.xxxx.us-east-1.amazonaws.com/dev/pets?type=dog&page=1

API 的调用者还在标头中包含x-api-key。我希望 API 网关将查询字符串参数和 x-api-key 传递给 lambda 函数。所以在AWS API Gateway Console 我已经配置了Integration Request 如下

lambda 函数如下所示

namespace AWSLambda1
{
    public class Function
    {
        public string FunctionHandler(LambdaRequest request, ILambdaContext context)
        {
            return string.Format("{0},{1},{2}", request.Type, request.Page, request.ApiKey);
        }        
    }
}

public class LambdaRequest
{
    public string Type { get; set; }
    public string Page { get; set; }
    public string ApiKey { get; set; }
}

问题
1> 当 lambda 函数接收到请求时,TypePage 属性为 NULL。

2>根据文档 API Gateway 可以使用命名约定 method.request.header.{param_name} 映射 http 标头,但是当我尝试将映射设置为 method.request.header.x-api-key 时,它会引发错误

指定的映射表达式无效:验证结果:警告: [],错误:[指定的映射表达式参数无效: method.request.header.x-api-key]

我不确定如何将这些查询字符串和标头映射到 C# lambda 对象

(请注意,我已经通过 SO post 建议将 JObject 作为 lambda 函数的参数。但它仅适用于我在 Integration Request 中启用 Use Lambda Proxy integration。在这种情况下 API 网关将所有信息传递给 lambda。这可能对我有用,但我试图避免将不需要的信息传递给 lambda 函数)

【问题讨论】:

  • 首先,您需要确保标头映射到Method Request,然后您可以映射到Integration Request。发生错误是因为您没有映射到 Method Request 部分,而是尝试在 Integration Request 中配置它。

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


【解决方案1】:

在此处添加完整答案。

标题问题

首先,您需要确保在Method Request 中添加了标题条目,然后您可以使用映射method.request.header.x-api-key 将其映射到Integration Request。发生错误是因为您没有在 Method Request 部分中添加,而是尝试仅在 Integration Request 中配置它。

Lambda 有效负载问题

您似乎没有使用Lambda Proxy Integration。如果您使用 Lambda 代理集成,那么您将获得完整的事件 JSON 对象事件数据到 Lambda。类似于您分享的post 中给出的答案。这个 JSON 对象将包含标头、查询参数、路径变量、url、请求正文等。如果您想查看一些示例,只需在 Lambda 上创建 API Gateway 测试事件即可。

现在,如果您不想使用 Lambda 代理集成但想限制发送到 Lambda 的内容,那么您必须创建集成映射模板以仅向 Lambda 发送所需的信息,例如标头、有效负载、查询参数等.,来自 API 网关。

示例集成模板。

{
  "body" : $input.json('$'),
  "headers": {
    #foreach($header in $input.params().header.keySet())
    "$header": "$util.escapeJavaScript($input.params().header.get($header))" #if($foreach.hasNext),#end

    #end
  },
  "method": "$context.httpMethod",
  "params": {
    #foreach($param in $input.params().path.keySet())
    "$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end

    #end
  },
  "query": {
    #foreach($queryParam in $input.params().querystring.keySet())
    "$queryParam": "$util.escapeJavaScript($input.params().querystring.get($queryParam))" #if($foreach.hasNext),#end

    #end
  }  
}

参考-

https://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda-event-from-api-gateway/

https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html

【讨论】:

  • 如果使用了 Lambda 代理集成,则不查看快照
猜你喜欢
  • 2017-05-08
  • 1970-01-01
  • 2017-11-14
  • 2023-04-02
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
相关资源
最近更新 更多