Отображение шаблона тела ответа шлюза 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=="
                }
    }

Спасибо и С уважением, Шривиньеш К.Н.

Другие вопросы по тегам