在JSONPath API网关主体映射中添加变量



使用AWS的API网关,我将API资源配置为KinesisPutRecords操作的AWS代理。API消费者向我发送了一个事件列表,我需要将这些事件转发到Kinesis流。

他们向API网关发送数据的格式与此类似。它包含一个类型为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字符串发送给Kinesis。

使用身体映射模板,我配置了以下内容。

{
"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。如果我用0替换$countVal,它工作得很好。

我需要使用$input.json(x),因为映射模板没有提供不同的方式来字符串化json对象。

问题:

  1. 除了$input.json(x)之外,是否有方法在Body Mapping Template中字符串化json对象?
    1. 我尝试过JSON.stringfy(对象),但没有成功
  2. 如何让代码识别该表达式中countVal的值?如果这个问题能够得到解决,问题就会得到解决

我已经设法使模板工作,创建了一个有效的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}

请告诉我这对你是否有效。

相关内容

  • 没有找到相关文章

最新更新