2016-07-04 80 views
0

我沿着以下:Using Amazon API Gateway as a proxy for DynamoDB在AWS API網關定義可選屬性 - > DynamoDB映射

以博客的例子,我想收緊什麼,以及如何將數據寫入到通過API網關一個dynamodb表前端。爲此,我定義的API網關下面的映射:

{ 
    "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. 根本不使用映射。顯然這是有效的,但現在一切都是未經過濾的,這是不需要的。

很明顯,我可以使用AWS lambda來代替映射,但是這感覺就像這樣一個常見的用例,即:可選屬性,這必須可以直接在Api Gateway中實現。

回答

2

@ka的禮貌:

Explatation: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

你介意試試這個映射模板嗎?如果消息爲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侯

+0

不幸的是,這不起作用:'執行失敗,由於配置錯誤:無法轉換請求' –

+0

得到它的工作。感謝您指點我正確的方向。看到我的答案 –