【问题标题】:Is it possible to access the original request body in a response body mapping template in AWS API Gateway?是否可以在 AWS API Gateway 的响应正文映射模板中访问原始请求正文?
【发布时间】:2019-06-27 03:33:57
【问题描述】:

使用 API Gateway,我正在尝试定义一个接受 application/json 的 POST 端点来执行以下操作:

  1. 异步触发 Lambda
  2. 使用由请求正文中的元素组成的 JSON 有效负载进行响应

我有 #1 工作。我认为这是书本上的。

这是我被绊倒的#2。看起来我无法在响应映射模板的上下文中访问请求正文。我可以使用 $input.params 访问原始查询参数,但我找不到任何可以为我提供原始请求正文的属性,我需要它来获取我想要响应的数据。要么就是这样,要么我需要弄清楚如何让 Lambda 异步启动以某种方式提供原始请求正文。

有人知道这是否可行吗?

我的目标是确保我的 API 尽可能快地响应,而不会导致 Lambda 冷启动以响应并同时通过启动 Lambda 来触发异步工作流。我也愿意直接与 SNS 而不是 Lambda 集成,并让 Lambda 订阅该主题,但我不知道这是否能让我访问响应映射模板中所需的数据。

【问题讨论】:

  • 你有没有尝试过类似{ "name" : "$input.params('name')", "body" : $input.json('$') } 或者直接$input.body 的东西?
  • @NickiKlein $input.params 具有请求的原始查询字符串参数,但 $input.body 为空,因为它来自异步 lambda 调用,我无法在任何变量中找到原始请求正文。

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


【解决方案1】:

要直接访问原始请求,您应该为 Lambda 使用 Proxy Integration,而不是通过普通集成进行映射。您将能够访问整个请求上下文,例如标头、路径参数等。

【讨论】:

  • 您的意思是访问 Lambda 中的原始请求,对吗?那不是我想要的。我想访问响应正文映射模板中的原始请求,并且我希望 Lambda 异步触发,这样在我发回响应之前我不会等待 Lambda 执行。
【解决方案2】:

我已经确定不可能做我想做的事。

【讨论】:

    【解决方案3】:

    来自https://stackoverflow.com/a/61482410/3221253

    将原始请求正文保存在集成映射模板中:

    #set($context.requestOverride.path.body = $input.body)
    

    在集成映射响应中检索它:

    #set($body = $context.requestOverride.path.body)
    {
       "statusCode": 200,
       "body": $body,
    }
    

    您还可以访问特定属性:

    #set($object = $util.parseJson($body))
    {
        "id": "$object.id"
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-20
      • 2017-11-30
      • 2017-06-25
      • 2018-05-02
      • 2022-10-14
      • 2021-04-20
      • 2018-05-13
      • 2016-12-03
      • 2016-06-28
      相关资源
      最近更新 更多