JSONPath API网关主体映射中的Acces变量

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。如果我替换$countVal0,它就可以正常工作。

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

问题:

  1. 除了$input.json(x)没有一种方法可以在主体映射模板中对json对象进行字符串化?
    1. 我已经尝试过JSON.stringify(object),但是没有用。
  2. 如何获取代码以识别该countVal表达式中的值?如果可以解决,则问题将得到解决。

kan*_*aki 5

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

请告诉我这是否对您有用。

  • 这里的问题是,当您再次解码 base64 时,它不是一个正确的 json 文档 `{application=iOS Build 3654}` 与 `{"application"="iOS Build 3654"}` - 第一个没有引号属性名称和值。 (3认同)