web-dev-qa-db-ja.com

POSTリクエスト本文をAmazon API GatewayからLambdaに渡す

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パーサーで使用できるように、本文を単に渡すようにテンプレートを構成するにはどうすればよいですか?

10
GameDroids

そして再び-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": {
        ...
    }
}
8
GameDroids