Переменная доступа в сопоставлении тела шлюза API JSONPath

Используя API-интерфейс AWS, я настроил ресурс API в качестве прокси-сервера AWS для Kinesis. PutRecords действие. Потребители API отправляют мне список событий, которые мне нужны, чтобы переслать эти события в поток Kinesis.

Формат, в котором они отправляют данные в шлюз API, выглядит примерно так. Он содержит 1 элемент верхнего уровня типа Array. Тип объекта каждого элемента массива - это документ JSON:

{
    "events":[
        {
            "time":"2017-01-01T11:43:21",
            "type":"ItemSelected",
            "application":"iOS Build 3654"
        },{
            "time":"2017-01-01:11:55:32",
            "type":"ItemSelected",
            "application":"iOS Build 3654"
        }
    ]
}

Необходимо разбить каждое отдельное событие на запись Kinesis и отправить его в виде base64Encoded Строка в Кинезис.

Используя шаблон отображения тела, я настроил следующее.

{
    "StreamName":"MemberApiAuditLog",
    "Records":[
        #foreach($elem in $input.path('$.events')){
        #set($countVal=$foreach.count-1)
            "Data":"$util.base64Encode($input.json('$.events[$countVal]'))",
            "PartitionKey":"$input.path('$.memberid')"
        }
        #end
    ]
}

У меня проблема в том, что шаблон картирования не имеет проблемы с этим $countVal переменная в этом коде: '$.events[$countVal]', Это как-то просто не распознает $countVal, Если я заменю $countVal с 0, это работает просто отлично.

Мне нужно использовать $input.json(x) потому что шаблон сопоставления не предоставляет другого способа для строкового преобразования объекта json.

Вопросы:

  1. Кроме как $input.json(x) Есть ли способ привести в порядок объект json в шаблоне отображения тела?
    1. Я пробовал JSON.stringify(объект), но это не сработало.
  2. Как я могу получить код для распознавания значения countVal в этом выражении? Если это может быть решено, проблема будет решена.

3 ответа

Мне удалось заставить шаблон работать, создав действительный объект json.

{
    "streamName": "MemberApiAuditLog",
    "Records": [
        #set($inputRoot = $input.path('$.events'))
        #foreach($elem in $inputRoot) {
           #set($json = $input.json("$[$foreach.index]"))
            "Data":"$util.base64Encode($json)",
        #end
    ]
}

У меня работает, надеюсь у вас тоже

Один из предыдущих примеров помог мне понять, как решить проблему такого типа, поэтому я хотел назвать решение по-другому.

Я думаю, что одинарные кавычки вокруг вашего$.events[$countVal]вызывает проблему. Двойные кавычки необходимы для правильной интерполяции, поэтому разделение назначения делает его более ясным и позволяет избежать путаницы или проблем, связанных с уходом/цитированием.

      ## Note the double quotes
#set($json = $input.json("$.events[$foreach.index]"))

"Data":"$util.base64Encode($json)"

Документация VTL также помогла мне:

# [ { ] set [ } ] ( $ref = [ ", ' ] arg [ ", ' ] )

arg анализируется (т.е. интерполируется), если он заключен в двойные кавычки, и не анализируется, если он заключен в одинарные кавычки.

Вам не нужно преобразовывать объекты в строки в цикле foreach. Вместо этого вы должны просто передать объект в функцию base64Encode, которая автоматически преобразует его в строку base64.

Следующий шаблон сопоставления произвел вывод ниже:

{
    "StreamName":"MemberApiAuditLog",
    "Records":[
        #foreach($elem in $input.path('$.events')){
            "Data":"$util.base64Encode($elem)",
            "PartitionKey":"$input.path('$.memberid')"
        }
        #end
    ]
}

Выход:

{
    "StreamName":"MemberApiAuditLog",
    "Records":[
        {
            "Data":"e3RpbWU9MjAxNy0wMS0wMVQxMTo0MzoyMSwgdHlwZT1JdGVtU2VsZWN0ZWQsIGFwcGxpY2F0aW9uPWlPUyBCdWlsZCAzNjU0fQ==",
            "PartitionKey":"my-member-id"
        }
        {
            "Data":"e3RpbWU9MjAxNy0wMS0wMToxMTo1NTozMiwgdHlwZT1JdGVtU2VsZWN0ZWQsIGFwcGxpY2F0aW9uPWlPUyBCdWlsZCAzNjU0fQ==",
            "PartitionKey":"my-member-id"
        }
    ]
}

И когда вы снова декодируете первую строку base64, вы должны получить такой результат:

{time=2017-01-01T11:43:21, type=ItemSelected, application=iOS Build 3654}

Пожалуйста, дайте мне знать, если это сработало для вас.

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