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

Posted

技术标签:

【中文标题】向 VTL 中的对象添加键/值对(用于 API 网关)【英文标题】:Adding a key/value pair to an object in VTL (for API Gateway) 【发布时间】:2018-05-21 09:52:52 【问题描述】:

我正在为 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,但无济于事。

【问题讨论】:

太垃圾了,AWS 采用 VTL 来处理 json 对象或任何类型的映射。 【参考方案1】:

这样的事情对我有用:

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

【讨论】:

这就是答案 - 完全符合原始问题的要求 感谢为我工作【参考方案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 将是你想要的。

【讨论】:

【参考方案3】:

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


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

【讨论】:

以上是关于向 VTL 中的对象添加键/值对(用于 API 网关)的主要内容,如果未能解决你的问题,请参考以下文章

如何为具有不同数量的键/值对的对象添加类型? [关闭]

jquery怎样向json中的object添加键值对(元素)?

在 VTL 中对字符串数组进行排序

js中往数组对象中添加键值对的方法有哪些?

js中往数组对象中添加键值对的方法有哪些?

如何从字典列表中向现有键值对添加新的键值对?