JD *_*art 6 json amazon-web-services aws-lambda aws-api-gateway
使用AWS的API网关,我将api资源配置为Kinesis PutRecords动作的AWS代理。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"
}
]
}
Run Code Online (Sandbox Code Playgroud)
所需的是将每个单独的事件分解为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
]
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,映射模板似乎$countVal对此代码中的变量没有问题:'$.events[$countVal]'。它以某种方式无法识别$countVal。如果我替换$countVal为0,它就可以正常工作。
我需要使用,$input.json(x)因为映射模板没有提供不同的方式来对json对象进行字符串化。
问题:
$input.json(x)没有一种方法可以在主体映射模板中对json对象进行字符串化?
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
]
}Run Code Online (Sandbox Code Playgroud)
它对我有用,对你也希望
Jur*_*gen -2
您不需要在 foreach 循环中将对象转换为字符串。相反,您应该能够简单地将对象传递给 base64Encode 函数,该函数会自动将其转换为 base64 字符串。
以下映射模板产生以下输出:
{
"StreamName":"MemberApiAuditLog",
"Records":[
#foreach($elem in $input.path('$.events')){
"Data":"$util.base64Encode($elem)",
"PartitionKey":"$input.path('$.memberid')"
}
#end
]
}
Run Code Online (Sandbox Code Playgroud)
输出:
{
"StreamName":"MemberApiAuditLog",
"Records":[
{
"Data":"e3RpbWU9MjAxNy0wMS0wMVQxMTo0MzoyMSwgdHlwZT1JdGVtU2VsZWN0ZWQsIGFwcGxpY2F0aW9uPWlPUyBCdWlsZCAzNjU0fQ==",
"PartitionKey":"my-member-id"
}
{
"Data":"e3RpbWU9MjAxNy0wMS0wMToxMTo1NTozMiwgdHlwZT1JdGVtU2VsZWN0ZWQsIGFwcGxpY2F0aW9uPWlPUyBCdWlsZCAzNjU0fQ==",
"PartitionKey":"my-member-id"
}
]
}
Run Code Online (Sandbox Code Playgroud)
当您再次解码第一个 Base64 字符串时,您应该得到以下结果:
{time=2017-01-01T11:43:21, type=ItemSelected, application=iOS Build 3654}
Run Code Online (Sandbox Code Playgroud)
请告诉我这是否对您有用。
| 归档时间: |
|
| 查看次数: |
1021 次 |
| 最近记录: |