Переменная доступа в сопоставлении тела шлюза 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.
Вопросы:
- Кроме как
$input.json(x)
Есть ли способ привести в порядок объект json в шаблоне отображения тела?- Я пробовал JSON.stringify(объект), но это не сработало.
- Как я могу получить код для распознавания значения
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}
Пожалуйста, дайте мне знать, если это сработало для вас.