2016-11-10 1 views
0

Я получаюSerializationException в создании новых записей с помощью Dynamodb Proxy Service в API

"__type": "com.amazon.coral.service#SerializationException" 

как ответ на почтальона & в тестовой консоли в API шлюза

Попытка опубликовать запись непосредственно dynamodb с помощью API Proxy Services .. я имею в виду эту статью AWS - https://aws.amazon.com/blogs/compute/using-amazon-api-gateway-as-a-proxy-for-dynamodb/

Вот мой Mapping

{ 
    "TableName": "TableNameGoesHere", 
    "Item": { 
    "id" : "$context.requestId" 
    "eventName" : "$input.path('$.eventName')", 
    "timestamp" : $input.path('$.timestamp'), 
    "answers": "$util.parseJson($input.path('$.answers'))" 
    } 
} 

Обновление: Я сделал как было задано ... и это сработало, но теперь, если я попытаюсь добавить массив из объектов JSON, он дает мне такую ​​же ошибку - вот что я сейчас пытаюсь сделать. Пожалуйста, помогите - Couldnt ничего не нашли в google

#set($inputRoot = $input.path('$')) 
{ 
    "TableName": "Answer", 
    "Item": { 
    "id": { 
      "S": "$context.requestId" 
      }, 
    "eventName": { 
      "S": "$input.path('$.eventName')" 
      }, 
    "timestamp" : { 
      "N": "$input.path('$.timestamp')" 
      }, 
    "answers": { 
      "S": "$input.path('$.answers')" 
      }, 
    "Line": { 
    "S" : "[ 
#foreach($elem in $inputRoot.Line) 
    { 
     "questionID" : "$elem.questionID", 
     "answer" : "$elem.answer" 
    }#if($foreach.hasNext),#end 

#end 
    ]" } 
    } 
} 

ответ

0

Для решения проблемы наличия массива объектов как часть полезной нагрузки.

для запроса Payload

{ 
    "emailId": "[email protected]", 
    "responses": [ 
     { 
      "question": "q1", 
      "answer": "a1" 
     }, 
     { 
      "question": "q2", 
      "answer": "a2" 
     } 
    ] 
} 

Шаблон будет

#set($inputRoot = $input.path('$')) 
{ 
    "TableName": "Customers", 
    "Item": { 
     "leadId": { 
      "S": "$context.requestId" 
     }, 
     "emailId": { 
      "S": "$input.path('$.emailId')" 
     }, 
     "responses": { 
      "L": [   // List type 
      #foreach($elem in $inputRoot.responses) // Loop thru array 
       { 
        "M": {  // Map type 
         "answer": { 
          "S": "$elem.answer" 
         }, 
         "question": { 
          "S": "$elem.question" 
         } 
        } 
       } 
       #if($foreach.hasNext),#end 
      #end 
      ] 
     } 
    } 
} 

Интеграция шаблона отклика (подобная структура как запрос)

#set($inputRoot = $input.path('$')) 
{ 
    "$results": [ 
    #foreach($elem in $inputRoot.Items) 
    { 
     "emailId": "$elem.emailId.S", 
     "responses": [ 
      #foreach($resp in $elem.responses.L) 
      { 
      "question": "$resp.M.question.S", 
      "answer": "$resp.M.answer.S" 
      } 
      #if($foreach.hasNext),#end 
      #end 
     ] 
    } 
    #if($foreach.hasNext),#end 
    #end 
    ] 
} 
2

Ваш шаблон сопоставления не соответствует формату DynamoDB. Это должно быть что-то вроде,

{ 
    "TableName": "Comments", 
    "Item": { 
     "commentId": { 
      "S": "$context.requestId" 
     }, 
     "pageId": { 
      "S": "$input.path('$.pageId')" 
      }, 
     "userName": { 
      "S": "$input.path('$.userName')" 
     }, 
     "message": { 
      "S": "$input.path('$.message')" 
     } 
    } 
} 
+0

Хорошо ... Я получил вашу точку зрения ... но я хочу добавить объект Json в поле базы данных - можете ли вы предоставить ссылку в aws-документах для него. –

+0

Это сработало, но я также пытаюсь добавить массив объекта Json, для которого я имею в виду http://docs.aws.amazon.com/apigateway/latest/developerguide/example-invoice.html#example-invoice -input-mapping, но я не получаю aws docs для API Тип данных –

+0

@mac mold Посмотрите на мой ответ ниже https://stackoverflow.com/a/44320439/1871718 –

0

Это мое решение:

"TableName": "Comments", 
"Item": { 
    "commentId": { 
     "S": "$context.requestId" 
    }, 
    "pageId": { 
     "S": "$input.path('$.pageId')" 
     }, 
    "userName": { 
     "S": "$input.path('$.userName')" 
    }, 
    "message": { 
     "S": "$input.path('$.message')" 
    } 
}