JSONPath API网关正文映射中的Acces变量

时间:2016-05-26 09:18:02

标签: 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"
        }
    ]
}

需要将每个单独的事件分解为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。如果我将$countVal替换为0,则可以正常使用。

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

问题:

  1. $input.json(x)以外有没有办法在Body Mapping模板中对json对象进行字符串化?
    1. 我尝试过JSON.stringify(object),但是没有用。
  2. 如何让代码识别该表达式中countVal的值?如果可以解决,问题就会得到解决。

2 个答案:

答案 0 :(得分:4)

我设法让模板工作,创建一个有效的json对象。

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

它适合我,也希望你

答案 1 :(得分:0)

您不需要在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}

如果这对您有用,请告诉我。