amazon-web-services - AWS API 网关响应正文模板映射(foreach)

我正在尝试通过 API 网关代理的 firehose 将数据保存在 S3 中。我已经创建了一个 API 网关端点,它使用 AWS 服务集成类型和用于 firehose 的 PutRecord 操作。我有映射模板作为

{
"DeliveryStreamName": "test-stream",
"Records": [
#foreach($elem in $input.path('$.data'))
{
"Data": "$elem"
}
#if($foreach.hasNext),#end
#end
]
}

现在,当我使用以下 JSON 测试端点时

{ 
"data": [ 
{"ticker_symbol":"DemoAPIGTWY","sector":"FINANCIAL","change":-0.42,"price":50.43},{"ticker_symbol":"DemoAPIGTWY","sector":"FINANCIAL","change":-0.42,"price":50.43} 
]
}

JSON被修改,转换后如下图

{ticker_symbol=DemoAPIGTWY, sector=FINANCIAL, change=-0.42, price=50.43}

:正在转换为 = 这不是有效的 JSON

不知道是不是上面的映射模板有问题

最佳答案

问题是,$input.path() 返回一个 json 对象,而不是 json 的字符串化版本。你可以看看文档here .

Data 属性期望值是一个字符串而不是一个 json 对象。长话短说——目前没有内置函数可以将 json 对象还原为其字符串化版本。这意味着您需要通过 $input.json() 重新读取循环中的当前元素。这将返回元素的 json 字符串表示,然后您可以将其添加为数据。

看看答案here这说明了这个概念。

在您的情况下,应用上面链接中描述的概念将产生如下映射:

    {
      "DeliveryStreamName": "test-stream",
      "Records": [
        #foreach($elem in $input.path('$.data'))
        {
          #set($json = $input.json("$[$foreach.index]"))
          "Data":"$util.base64Encode($json)",
        }
        #if($foreach.hasNext),#end
        #end
      ]
    }

https://stackoverflow.com/questions/48893224/

相关文章:

git - 如何在 VS Code 中只提交跟踪的文件?

bazel - 从 bazelrc 选择特定于平台的默认值 --config

json - 如何在 vuejs 中将 JSON 对象发布到 Web 服务器?

java - 如何在 GraphQL Java 上拆分模式

google-chrome-extension - 将 Google Chrome 扩展程序限制为选

spring - @Transactional(read-only = true) 的目的是什么

google-forms - 在谷歌表单中将文本右对齐

javascript - 如何从提供 NET::ERR_CERT_AUTHORITY_INVALID

macos - 有没有办法防止 OSX 用数千个 .DS_Store 文件污染我的项目?

python-3.x - 在 XGBoost 中应用增量学习进行分类设置时出错(python)