Отображение шаблона тела ответа шлюза AWS API (foreach)
Я пытаюсь сохранить данные в S3 через пожарный шланг, проксированный через API-шлюз. Я создал конечную точку шлюза API, которая использует тип интеграции службы AWS и действие 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
Не уверен, что что-то не так в приведенном выше шаблоне отображения
2 ответа
Проблема в том, что
$input.path()
возвращает объект json, а не строковую версию json. Вы можете ознакомиться с документацией здесь .
Свойство Data ожидает, что значение будет строкой, а не объектом json. Короче говоря, в настоящее время нет встроенной функции, которая может вернуть объект json в его строковую версию. Это означает, что вам нужно перечитать текущий элемент в цикле через
$input.json()
. Это вернет строковое представление элемента в формате json, которое затем можно будет добавить как данные.
Взгляните на ответ здесь, который иллюстрирует эту концепцию.
В вашем случае применение концепции, описанной в приведенной выше ссылке, приведет к такому отображению:
{
"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
]
}
API Gateway рассматривает данные полезной нагрузки как текст, а не как Json, если это не указано явно.
Kinesis также ожидает, что данные будут в кодированном формате при прокси через API Gateway.
Попробуйте следующий код, и это должно сработать, задаваясь вопросом, почему цикл for был прокомментирован в шаблоне отображения.
Предполагая, что вы не просматриваете набор записей, следующее решение должно работать для вас.
{
"DeliveryStreamName": "test-stream",
"Record": {
"Data": "$util.base64Encode($input.json('$.Data'))Cg=="
}
}
Спасибо и С уважением, Шривиньеш К.Н.