在AWS Api Gateway中定义可选属性 - > DynamoDB映射

时间:2016-07-04 16:32:10

标签: amazon-web-services amazon-dynamodb aws-api-gateway

我正在跟随: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是可选的。我该怎么办?我无法让它发挥作用。我试过了:

  1. 按原样使用上述映射,但发送没有message - 属性的正文。 - > “一个或多个参数值无效:AttributeValue可能不包含空字符串” 2使用上面的映射,但发送一个message=null的正文。 - > “一个或多个参数值无效:AttributeValue可能不包含空字符串”
  2. 通过省略mapping - >的定义来更改上述映射现在没有message传递身体显然成功了。但是,发送message的正文并未通过message(这是我的预期,但想要用尽所有选项)
  3. 根本不要使用映射。显然这是有效的,但现在一切都是未经过滤的,这是不需要的。
  4. 显然,我可以使用AWS lambda来进行映射,但这感觉就像一个常见的用例,即:可选属性,这必须直接在Api网关中实现。

2 个答案:

答案 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