【问题标题】:AWS API Gateway integration request body mapping template throws out passed in valuesAWS API Gateway 集成请求正文映射模板抛出传入的值
【发布时间】:2017-12-24 00:09:20
【问题描述】:

我在使用 AWS API Gateway 时遇到问题,我的所有输入组合都可以正常工作,但其中一个会抛出另一个传入的值。

这是我的模板...

#set($greet = $input.params('greet'))
#set($name = $input.params('username'))
{
#if($greet != "")
    "greet": "$greet"
    #if($name != "")
    ,
    #end
#end
#if($name != "")
    "name": "$name"
#end
}

我的网址是/user/{username}/say/{greet}

当我测试端点并且不发送问候语或用户名时,它可以工作。当我发送问候语但没有用户名时,它可以工作。当我发送问候语和用户名时,它可以工作。 (“作品”是指它将值传递给我的 lambda 函数。)

但由于某种原因,当我发送用户名但没有问候时,映射会完全丢弃用户名并且不会发送它(就像 $name = '')。它仍然会到达正确的端点,因为正确的 lambda 函数会执行,映射只是发送一个空对象而不是仅具有 name 属性的对象。

谁能看到我做错了什么?

【问题讨论】:

  • 如果这两个值都没有设置,您的 JSON 正文似乎无效,包含 { , }
  • @Michael-sqlbot 如果两者都没有设置,则 JSON 正文是有效的,因为它只会吐出 { }。我已经验证了这按预期工作。这是给出用户名的情况,但由于某种原因没有返回任何问候。
  • 你说得对,我看错了。

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


【解决方案1】:

您的映射很好。我猜你的 API Gateway 配置需要针对空问候的场景进行调整。

如果没有问候语,AWS 不会执行变量后面的方法绑定,而是执行父资源(在本例中为“/say”方法绑定)。因此,您需要两种方法定义,一种带有问候语,一种没有。由于您的映射模板支持这两种结果,因此两者可以进行相同的配置。

【讨论】:

  • 有道理,但知道为什么它仍然会使用正确的 lambda 函数吗? (不配置 /user/{username}/say)
  • 不应该,我试过你的配置,没有第二种方法,API网关没有调用我的lambda。
  • 啊,我明白了。它在网关的测试功能中调用它很好,但在部署时却没有。我觉得它应该在网关测试中失败,但我想它不会。好吧,我会把它归结为怪异。
猜你喜欢
  • 2018-01-20
  • 2016-01-21
  • 2017-11-30
  • 2021-04-20
  • 2018-01-25
  • 2018-05-02
  • 2020-09-28
  • 2019-08-11
  • 2018-02-03
相关资源
最近更新 更多