2016-05-26 10 views
1

AWSのAPIゲートウェイの使用私は、KinesisのPutRecordsアクションに対するAWSプロキシとしてAPIリソースを設定しました。 APIのコンシューマーは、これらのイベントをキネシスのストリームに転送するのに必要なイベントのリストを私に送信します。JSONPath APIゲートウェイボディマッピングのAcces変数

データをAPIゲートウェイに送信する形式は、これと似ています。これには、配列型のトップレベル要素が1つ含まれています。各配列項目のオブジェクトタイプは、JSONドキュメントされています。必要なのはキネシスレコードにそれぞれ別のイベントを破り、キネシスへbase64Encoded文字列と、それを送信するために

{ 
    "events":[ 
     { 
      "time":"2017-01-01T11:43:21", 
      "type":"ItemSelected", 
      "application":"iOS Build 3654" 
     },{ 
      "time":"2017-01-01:11:55:32", 
      "type":"ItemSelected", 
      "application":"iOS Build 3654" 
     } 
    ] 
} 

です。

ボディマッピングテンプレートの使用私は以下を設定しました。 '$.events[$countVal]'

{ 
    "StreamName":"MemberApiAuditLog", 
    "Records":[ 
     #foreach($elem in $input.path('$.events')){ 
     #set($countVal=$foreach.count-1) 
      "Data":"$util.base64Encode($input.json('$.events[$countVal]'))", 
      "PartitionKey":"$input.path('$.memberid')" 
     } 
     #end 
    ] 
} 

私がいる問題は、マッピングテンプレートは、このコードでは、この$countVal変数に問題があるようには見えないということです。それは何とかちょうど$countValを認識しません。私がを0に置き換えると、うまく動作します。

$input.json(x)を使用する必要があります。マッピングテンプレートは、jsonオブジェクトを文字列化する別の方法を提供しないためです。

質問:

$input.json(x)以外
  1. ボディマッピングテンプレートでJSONオブジェクトを文字列化する方法はありますか?
    1. 私はJSON.stringify(オブジェクト)を試しましたが、うまくいきませんでした。
  2. この式でcountValの値を認識するには、どうすればコードを取得できますか?それが解決できれば、問題は解決されます。

答えて

0

foreachループでオブジェクトを文字列に変換する必要はありません。その代わりに、オブジェクトをbase64Encode関数に渡すだけで、自動的にbase64文字列に変換できます。

次のマッピングテンプレートは、以下の出力を生成:

{ 
    "StreamName":"MemberApiAuditLog", 
    "Records":[ 
     #foreach($elem in $input.path('$.events')){ 
      "Data":"$util.base64Encode($elem)", 
      "PartitionKey":"$input.path('$.memberid')" 
     } 
     #end 
    ] 
} 

出力:

{ 
    "StreamName":"MemberApiAuditLog", 
    "Records":[ 
     { 
      "Data":"e3RpbWU9MjAxNy0wMS0wMVQxMTo0MzoyMSwgdHlwZT1JdGVtU2VsZWN0ZWQsIGFwcGxpY2F0aW9uPWlPUyBCdWlsZCAzNjU0fQ==", 
      "PartitionKey":"my-member-id" 
     } 
     { 
      "Data":"e3RpbWU9MjAxNy0wMS0wMToxMTo1NTozMiwgdHlwZT1JdGVtU2VsZWN0ZWQsIGFwcGxpY2F0aW9uPWlPUyBCdWlsZCAzNjU0fQ==", 
      "PartitionKey":"my-member-id" 
     } 
    ] 
} 

そして、あなたは再び第1 base64文字列をデコードするとき、あなたはこの結果を取得する必要が:

{time=2017-01-01T11:43:21, type=ItemSelected, application=iOS Build 3654} 

それがうまくいくかどうか教えてください。

+0

がここでの問題は、あなたが再びbase64でデコードするとき、それは適切なJSONドキュメント 'ではないということです{アプリケーション= iOSが3654を構築します} 'vs' {"application" = "iOS Build 3654"} ' - 最初のプロパティはプロパティ名と値の引用符を持っていません。 –

+0

正しいJsonドキュメント@JDStuartを取得する運がありますか? – kanedaki

1

テンプレートを有効にして、有効なjsonオブジェクトを作成しました。

{ 
 
    "streamName": "MemberApiAuditLog", 
 
    "Records": [ 
 
     #set($inputRoot = $input.path('$.events')) 
 
     #foreach($elem in $inputRoot) { 
 
      #set($json = $input.json("$[$foreach.index]")) 
 
      "Data":"$util.base64Encode($json)", 
 
     #end 
 
    ] 
 
}

それは私のために動作しますが、あまりにもあなたの希望

+0

これも私のために働いた - ありがとう! –

関連する問題