11

我正在为 AWS API Gateway 集成响应编写映射模板。我想向返回我的 Lambda 函数的 JSON 对象添加一个键/值对。

我的函数返回一些像这样的 JSON:

{
  "id": "1234",
  "name": "Foo Barstein"
}

我希望模板输出如下内容:

{
  "id": "1234",
  "name": "Foo Barstein",
  "href": "https://example.tld/thingy/1234"
}

我的映射模板如下所示:

#set($thingy = $input.json('$'))
#set($thingy.href = "https://example.tld/thingy/$thingy.id")

$thingy

但是,我的模板输出 unmodified $thingy,而href我没有尝试添加。

我已阅读VTL 用户指南,但无济于事。

4

3 回答 3

5

像这样的东西对我有用:

#set($body = $input.path('$'))
#set($body.href = "https://example.tld/thingy/$body.id")
$input.json('$')
于 2019-04-09T11:11:48.860 回答
2

没有简单的方法可以实现这一点,但您可以解决它:

## Mapping template
#set($body = $input.body)
#set($id = $input.json('$.id'))
{
  "custom": {
    "href" : "https://example.tld/thingy/$id"
  },
  "body": $body
}

然后合并 AWS.Lambda 中的所有键(如果您使用 Lambda):

## Lambda handler
exports.handler = function(event, context) {
  const requestParams = Object.assign({}, event.body, event.custom);
  // ... function code
}

并且requestParams会是你想要的。

于 2018-08-16T15:19:58.517 回答
2

以下可以解决问题。当心,未经测试!

{
  #set($payload = $util.parseJson($input.json('$')))
  #set($body = "{
    #foreach ($mapEntry in $payload.entrySet())
      ""$mapEntry.key"": ""$mapEntry.value"",
    #end
    ""href"": ""$payload.id""
  }")
  $body
}
于 2019-02-08T16:29:30.570 回答