【问题标题】:How to pass Post Parameter from API gateway to Lambda如何将 Post 参数从 API 网关传递到 Lambda
【发布时间】:2020-11-05 13:07:33
【问题描述】:

我正在创建一个用于学习无服务器框架的演示项目。

我有一个 Lambda 函数,通过以下方式从事件对象中输入两个参数:

operandOne = event["operandOne"] operandTwo = event["operandTwo"]

我创建了一个 API 网关,它使用这个参数调用这个 lambda 函数。

到目前为止,我一直在关注此链接以获得答案,但仍未弄清楚如何实施。 - AWS Lambda: Clarification on retrieving data from event object

上面给出的答案有三种传递参数的方式,我对第三个选项感兴趣。 "3) 直接在事件对象上"

这可以在 AWS 控制台的映射模板的帮助下完成。但是我正在尝试找到一种方法来使用云形成(在 yaml 文件中编写映射模板)用于相同的学习目的。

【问题讨论】:

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


    【解决方案1】:

    但我正在尝试找到一种方法来使用云形成(在 yaml 文件中编写映射模板)用于相同的学习目的。

    为此,您必须在 RequestTemplatesAWS::ApiGateway::Method 中提供您的模板:

    应用于请求负载Apache Velocity模板的映射。 API Gateway 使用的模板基于客户端发送的 Content-Type 标头的值。

    您提供的链接中的一个通用示例是:

            RequestTemplates: 
              application/json: {"hello": $input.params('$hello')}            
    

    【讨论】:

    • 我使用以下代码尝试了相同的操作:"{ \"operator1\": \"$input.params('$operator1')\", \"operator2\": \"$input.params('$operator2')\" }" Just 确认在使用 GET 发送数据时使用了 $input.params。你能请我做错了吗
    【解决方案2】:

    当您有来自连接到 Lambda 函数的 API Gateway 的发布请求时,您可以通过 event.body 访问事件对象中的所有正文参数。如果正文使用 JSON 进行字符串化,您可以这样做:

    const body = JSON.parse(event.body)
    const operandOne = body.operandOne
    const operandTwo = body.operandTwo
    
    

    不需要任何模板

    【讨论】:

    • 感谢您的回复。我已经使用了上面指定的方式。但我想要实现的是创建一个前端来访问 lambda 并直接将它与其他 AWS 服务一起使用。因此,为了实现这一点,我需要保持 Lambda 端的实现简洁明了,而无需添加更多标志作为请求数据的人。就像直接从 Lambda 的事件对象访问对象一样。发送数据时我遇到的唯一问题是我需要从 event["body"] 访问数据,而不是直接从 event.
    • 我不确定为什么要关注事件对象。 Lambda 旨在从 AWS 服务接收事件对象,然后 Lambda 至少有机会在将该对象传递给队列中的下一个服务之前转换该对象。真的,解决方案是让 Lambda 接收 API Gateway 事件对象,生成您想要的对象并使用您构造的对象手动调用 Lambda 函数:docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/…
    • 是的,我目前正在学习 AWS 服务,因此正在探索所有不同的选项。也会试试这些。但我只是想实现 API Gateway 和一个 Lambda 函数的直接集成。
    【解决方案3】:

    我对 API Gateway 的输入如下:

    {
        operandOne: 2
        operandTwo: 3
    }
    

    API Gateway 需要一个主体映射模板来为 lambda 函数映射此参数并将它们发送到事件对象中。可以有两种方式

    1. 使用 AWS 控制台
    2. 使用云形成模板

    我想使用第二种方法。

    这是我在 cloud_formation.template.yml 文件中写的内容

    APIGatewayDefinition:
      Type: 'AWS::Serverless::Api'
      Properties:
        basePath: /
          paths:
            /insert:
              post:
                summary:
                description:
                consumes:
                 - application/json
                produces:
                 - application/json
                x-amazon-apigateway-integration:
                  requestTemplates:
                    application/json: "#set ($root=$input.path('$')) { \"operandOne\": \"$root.operandOne\", \"operandOne\": \"$root.operandOne\" }"
                  type: aws
    ....
    
    

    然后我可以直接从事件对象而不是从事件对象中的主体访问 Lambda 中的变量。

    operandOne = event["operandOne"]
    operandTwo = event["operandTwo"]
    

    供参考: AWS Lambda: Clarification on retrieving data from event object

    【讨论】:

      猜你喜欢
      • 2015-11-10
      • 2019-03-18
      • 1970-01-01
      • 2020-03-28
      • 2014-03-04
      • 2019-11-27
      • 1970-01-01
      • 2017-05-19
      相关资源
      最近更新 更多