如何允许API网关映射模板中的可选密钥



我有一个API网关,它扫描DynamoDB表。我想在我的请求体中传递LastEvaluatedKey;如果我传递了一个LastEvaluatedKey,那么一切都正常了,我得到了一个带有预期数据的响应——所以我已经完成了一半。

但是,当然,我第一次向API发送请求时LastEvaluatedKey将不存在,因此映射模板中需要LastEvaluatedKeyExclusiveStartKey必须是可选的。我已经尝试了几种不同的方法来让它成为可选的,但到目前为止没有任何效果。这是我所拥有的:

#set($hasName = $input.json('$.Name'))
{
"TableName": "MyTable",
#if($hasName && $hasName.length() != 0)
"ExclusiveStartKey": {
"Name": {
"S": $input.json('$.Name')
},
"Date": {
"S": $input.json('$.Date')
}
},#end
"FilterExpression": "begins_with(#dt, :tdt)",
"ExpressionAttributeNames": {
"#dt": "Date"
},
"ExpressionAttributeValues": {
":tdt": {
"S": "$input.params('date')"
}
}
}

正如我所说,当我do在我的请求体中传递LastEvaluatedKey时,上述方法有效,但当我不传递时,我会得到错误:

{
"__type": "com.amazon.coral.validate#ValidationException",
"message": "The provided starting key is invalid: One or more parameter values were invalid: An AttributeValue may not contain an empty string"
}

人们仍然期待LastEvaluatedKey

我也试过把NameDate包装在#if里面,但一点运气都没有。我从其他答案中获得了灵感,比如:这个和这个,但没有运气。

在我的示例中,cursorLastEvaluatedKey:

#set($hasCursor = $input.params('cursor') != "")
{
"TableName": "my-table"
#if($hasCursor) "ExclusiveStartKey":$util.base64Decode("$input.params('cursor')")
#end
}

它只是检查cursor是否作为查询参数传递(如/my/api?cursor=myencodedlastevaluatedkey(,如果是,则只将ExclusiveStartKey添加到请求中。

如果您事先知道两个键都是字符串类型,那么您可以执行:

#set($Name = $input.params('Name'))
#set($Date = $input.params('Date'))
{
#if($Name != '' && $Date != '')
"ExclusiveStartKey": {
"Name": {
"S": "$Name"
},
"Date": {
"S": "$Date"
}
},
#end
#if($Date != '')
"FilterExpression": "begins_with(#dt, :tdt)",
"ExpressionAttributeNames": {
"#dt": "Date"
},
"ExpressionAttributeValues": {
":tdt": {
"S": "$Date"
}
}
},
#end
"TableName": "MyTable"
}

这使得过滤器是可选的,仅当Date作为参数传递时

最新更新