AWS API Gateway呼び出しによってトリガーされるJavaで記述されたAWS Lambda関数があります。
JSONをペイロードとしてエンドポイントの1つにPOST
リクエストを送信しようとしています。
curl -H "Content-Type: application/json" -X POST -d '{"firstName":"Mr", "lastName":"Awesome"}' https://someexample.execute-api.eu-central-1.amazonaws.com/beta/MethodHandlerLambda
次に、ゲートウェイはContent-Type
を検出し、デフォルトの テンプレート を介してすべての要求パラメーター(本文を含む)を渡します。興味深い部分はこれです
#set($allParams = $input.params())
{
"body-json" : $input.json('$'),
....
それは私のJavaメソッドに渡されるMap<String, Object>
を提示することになっています:
public void myHandler(Map<String, Object> input, Context context){
input.keySet().forEach((key) -> {
System.out.println(key + " : " + input.get(key));
});
}
そして結果は次のようになります:
body-json : {"firstName":"Mr", "lastName":"Awesome"}
...
しかし、私が得ているのはこれです:
body-json : {firstName=Mr, lastName=Awesome}
別の可能性は、全身を文字列として渡すことです:
"body" : $input.body
ただし、これはkey=value
ではなくkey:value
に「変換」するだけです。
JSONパーサーで使用できるように、本文を単に渡すようにテンプレートを構成するにはどうすればよいですか?
そして再び-SOでここに質問を投稿するだけで自分で答えを見つけるのに役立ちます:)
AWS Api Gatewayテンプレートで、本文を
"body-json" : $input.body
whichshouldは、完全なペイロードを文字列として返します。
しかし、もっと重要なことに、私は Greggsが彼自身の質問に答える を読み、私のメソッドを
public void myHandler(InputStream inputStream, OutputStream outputStream, Context context) throws IOException{
final ObjectMapper objectMapper = new ObjectMapper();
JsonNode json = objectMapper.readTree(inputStream);
System.out.println(json.toString());
}
したがって、単純なInputStream
を用意し、それをJsonNode
として、JSONライブラリーを好きなように読み取れば十分です(私はJackson FasterXMLを使用しています)。そして出来上がり、それはすべての可能なパラメーターを単一のJSONにパックします(テンプレートで指定されているとおり)
{
"body-json": {
"firstName": "Mr",
"lastName": "Awesome"
},
"params": {
...
},
"stage-variables": {
...
},
"context": {
...
}
}