将键/值对添加到VTL中的对象(对于API网关)

时间:2017-12-07 10:10:33

标签: aws-api-gateway vtl

我正在为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

但是,我的模板会输出未经修改的$thingy,而没有我尝试添加的href

我已阅读VTL user guide,但无济于事。

3 个答案:

答案 0 :(得分: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将是您想要的。

答案 1 :(得分:2)

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

{
  #set($payload = $util.parseJson($input.json('$')))
  #set($body = "{
    #foreach ($mapEntry in $payload.entrySet())
      ""$mapEntry.key"": ""$mapEntry.value"",
    #end
    ""href"": ""$payload.id""
  }")
  $body
}

答案 2 :(得分:0)

类似的东西对我有用:

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