基于文档、论坛帖子等,我想出了这个解决方案,首先将 url 编码形式的帖子数据转换为变量,然后在发送到 Firehose 之前对其进行 base64 编码(firehose 需要采用这种格式的有效负载)
#set($data = {})
#foreach( $token in $input.path('$').split('&') )
#set( $keyVal = $token.split('=') )
#set( $keyValSize = $keyVal.size() )
#if( $keyValSize >= 1 )
#set( $key = $util.urlDecode($keyVal[0]) )
#if( $keyValSize >= 2 )
#set( $val = $util.urlDecode($keyVal[1]) )
#else
#set( $val = '' )
#end
#end
$util.qr($data.put("$key", "$val"))
#end
{
"DeliveryStreamName": "my-firehose",
"Record": {
"Data": "$util.base64encode($data)"
},
"PartitionKey": "1"
}
但是转换后的结果是
{
"DeliveryStreamName": "my-firehose",
"Record": {
"Data": ""
},
"PartitionKey": "1"
}
我尝试了各种排列,$util.qr($data.put("$key", "$val"))
但似乎都没有
$util.qr($data.put("$key", $val))
$util.qr($data.put("$key", $util.parseJson($val)))
$util.qr($data.put("$key", $util.toJson($util.parseJson($val))))
$util.qr($data.put("$key", "abc")) // hardcoded just to debug
Data
但所有这些都会在最终输出中产生一个空块。
而这个甚至没有变形(抛出 500)
#set($data = {
#foreach( $token in $input.path('$').split('&') )
#set( $keyVal = $token.split('=') )
#set( $keyValSize = $keyVal.size() )
#if( $keyValSize >= 1 )
#set( $key = $util.urlDecode($keyVal[0]) )
#if( $keyValSize >= 2 )
#set( $val = $util.urlDecode($keyVal[1]) )
#else
#set( $val = '' )
#end
#end
"$key": "$val" #if($foreach.hasNext),#end
#end
})
{
"DeliveryStreamName": "my-firehose",
"Record": {
"Data": "$util.base64encode($data)"
},
"PartitionKey": "1"
}
我在搞砸什么?
更新
基于@michael-sqlbot 的指针,我确实找到了神奇的配方(虽然不是完整的配方)
#set($data = {})
#foreach( $token in $input.path('$').split('&') )
#set( $keyVal = $token.split('=') )
#set( $keyValSize = $keyVal.size() )
#if( $keyValSize >= 1 )
#set( $key = $util.urlDecode($keyVal[0]) )
#if( $keyValSize >= 2 )
#set( $val = $util.urlDecode($keyVal[1]) )
#else
#set( $val = '' )
#end
#end
$!data.put("$key", "$util.parseJson($val)")
#end
{
"DeliveryStreamName": "my-firehose",
"Record": {
"Data": "$util.base64Encode($data)"
},
"PartitionKey": "1"
}
还有,base64encode
需要base64Encode
。随着这些变化,我看到数据流过。剩下的唯一问题是它不完全是 JSON:
"data": "{abc={user_info={session_id=}, event_id=77841543625, date_time=2019-12-16T21:26:17.911Z}, sb=, hello=world}"
它也没有正确引用字符串,所以也许还有更多的事情要做。