2

我一直在使用 AWS API Gateway 上的映射模板,特别是用于 DynamoDB 集成。而且我发现检查可选字段非常不方便。例如,我有一个这样的 JSON 有效负载:

{
    "optional_field": "abcd" 
}

现在把它放到数据库中,我使用这样的映射:

#set($hasOptionalField = $input.path('$.optional_field') != "")
{
    "TableName": "A_Table",
    "Item": {
        "id": {"S": "$context.requestId"}
#if($hasOptionalField),
        "optional_field": {"S": "$input.path('$.optional_field')"}
#end
    }
}

根据Apache Velocity Reference,我应该能够使用更简单的语法检查 null、empty、false 或零并自动回退到某个替代值,如下所示:

{
    "TableName": "A_Table",
    "Item": {
        "id": {"S": "$context.requestId"},
        "optional_field": {"S": "${input.path('$.optional_field')|'no_data'}"}
    }
}

我可以让它保持原样而没有任何后备,但是如果尝试将空字符串作为属性值,DynamoDB API 会给你一个错误。

似乎 API 网关映射模板没有 100% 实现 Apache Velocity 规范?

4

1 回答 1

2

您可以使用#if-else 回退到有效负载中可选字段的默认值。

#set($req = $input.path('$'))
#if($req.optional_field != "")
#set( $my_default_value = $input.path('$.optional_field'))
#else
#set ($my_default_value = "no_data")
#end
{
    "TableName": "A_Table",
    "Item": {
        "id": {
            "S": "$context.requestId"
        },
        "optional_field": {
            "S": "$my_default_value"
        }
    }
}
于 2021-04-20T04:51:49.943 回答