我正在跟随:Using Amazon API Gateway as a proxy for DynamoDB
以博客为例,我想收紧Api Gateway将数据写入dynamodb表前端的内容和方式。为此,我在Api Gateway中定义了以下映射:
{
"TableName": "Comments",
"Item": {
"commentId": {
"S": "$context.requestId"
},
"pageId": {
"S": "$input.path('$.pageId')"
},
"userName": {
"S": "$input.path('$.userName')"
},
"message": {
"S": "$input.path('$.message')"
}
}
}
接下来,使用以下示例进行测试就可以了:
{
"pageId": "breaking-news-story-01-18-2016",
"userName": "Just Saying Thank You",
"message": "I really enjoyed this story!!"
}
但是,假设我想保留与上面相同的映射,但希望message
是可选的。我该怎么办?我无法让它发挥作用。我试过了:
message
- 属性的正文。 - > “一个或多个参数值无效:AttributeValue可能不包含空字符串”
2使用上面的映射,但发送一个message=null
的正文。 - > “一个或多个参数值无效:AttributeValue可能不包含空字符串”mapping
- >的定义来更改上述映射现在没有message
传递身体显然成功了。但是,发送message
的正文并未通过message
(这是我的预期,但想要用尽所有选项)显然,我可以使用AWS lambda来进行映射,但这感觉就像一个常见的用例,即:可选属性,这必须直接在Api网关中实现。
答案 0 :(得分:2)
由@ka提供:
解释:APi网关使用空字符串或其他东西自动填充不存在的属性。这需要从if中排除。
还要注意if语句后面的关键,
。
{
"TableName": "Comments",
"Item": {
"commentId": {
"S": "$context.requestId"
},
"pageId": {
"S": "$input.path('$.pageId')"
},
"userName": {
"S": "$input.path('$.userName')"
}#if($input.path('$.description') && $input.path('$.message') != ""),
"message": {
"S": "$input.path('$.message')"
}
#end
}
}
答案 1 :(得分:0)
你介意尝试这个映射模板吗?如果消息为NULL,则不会将其添加到正文中。
{
"TableName": "Comments",
"Item": {
"commentId": {
"S": "$context.requestId"
},
"pageId": {
"S": "$input.path('$.pageId')"
},
"userName": {
"S": "$input.path('$.userName')"
}#if ($.message),
"message": {
"S": "$input.path('$.message')"
}
#end
}
}
谢谢, -Ka Hou