2016-05-23 8 views
0

このエラーには他にも質問がありますが、これは私のシナリオではありません。APIゲートウェイ:「START_OBJECTトークンからjava.lang.Stringのインスタンスを逆シリアル化できません」

テスト私の単純なGETリクエストは、テストコンソールにerrorMessageフィールドに次のようにして失敗します。

Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: [email protected]; line: 1, column: 1 

私のラムダ関数は一つのパラメータを取る静的メソッドget持つ単純なJavaクラスですからIDパスパラメータ。例えば

mysite.com/resource/1からGETを行うと、私の静的なクラスのget方法に1を渡す必要があります。

リクエストボディをマッピングしていないため、マッピングを設定していません。 API Gatewayのドキュメントは非常に混乱していて、同様のシナリオを扱った例については非常に軽いです。

ラムダ関数のパラメータにパスパラメータをマップするにはどうすればよいですか?

答えて

1

ちょうどバックグラウンドのために、ラムダ関数には "parameters"という概念はありません。すべてが関数への要求ペイロードに入ります。したがって、あなたの場合は、インテグレーションのマッピングテンプレートを使用して、着信GETパラメータをラムダに与えることができるJSONペイロードに変換する必要があります。

パスパラメータは、クエリ文字列パラメータと同じマッピングテンプレートオブジェクトで使用できます。これは$ input.params([name])です。ここで[name]はパラメータの名前です。

だからあなたのテンプレートは次のようになります。

のContent-Type:アプリケーション/ JSON

テンプレート:

{ 
    "resourceId" : "$input.params('your_name_here')" 
} 

私は引用符でJSON値を置くが、値がに保証されている場合あなたがそれらを取り除くことができる数字である。とにかくそれを引用符で囲むことはおそらくもっと安全でしょう。 API Gatewayは、チェック着信要求のContent-Typeヘッダを使用するマッピングテンプレートを決定しますので、http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html

のContent-Typeはここに実際に重要である:

はここでテンプレートの参照です。通常、GETリクエストではContent-Typeヘッダーがないため、APIゲートウェイでは 'application/json'が必要と仮定しているため、テンプレートがapplication/json以外のコンテンツタイプにマップされている場合、期待通りに機能しません。


編集:

+0

い '$ input.params'表紙パスパラメータすぎラムダ統合の詳細な背景?私はこれを試しても同じ問題を抱えています。 –

+0

はい、あります。 パラメータが正しく設定されていない可能性がありますか?したがって、リソースパスは "/ resource/{foo}"であり、 'foo'というパスパラメータが正しいでしょうか?その場合、上記の貼り付けたテンプレートは、使用すると完全に動作するはずです { "resourceId": "$ input.params( 'foo')" } –

+0

コンテンツタイプが私をここで混乱させます。 GETリクエスト。応答は現時点では実際には文字列であり、javaのハンドラメソッドは単にpublic static String get(String id){...}です。私のデプロイされたバージョンへのGETリクエストは 'get(pathParameter)'を起動するだけですが、この同じエラーメッセージが表示されるようです。さらに、コンテンツタイプをapplication/jsonに設定し、それを提案してマッピングすると、私はまだエラーが発生します。困った。 –

関連する問題