将POST请求正文通过Amazon API Gateway传递给Lambda

时间:2017-06-27 13:41:09

标签: java json amazon-web-services aws-lambda aws-api-gateway

我有一个用Java编写的AWS Lambda函数,它由AWS API Gateway调用触发。

我正在尝试使用JSON作为有效负载向其中一个端点发出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并通过默认template传递所有请求参数(包括正文)。有趣的部分是这一个

#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解析器中使用它?

1 个答案:

答案 0 :(得分:7)

再一次 - 只是在SO上发布一个问题有助于自己找到答案:)

在AWS Api Gateway模板中,我将主体设置为

"body-json" : $input.body

应该以字符串形式返回完整的有效负载。

但更重要的是,我看了Greggs answer to his own question并将我的方法更改为

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": {
        ...
    }
}