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

10

我有一个用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并通过默认模板传递所有请求参数(包括正文)。有趣的部分是这个。

#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个回答

9

再次强调-在SO上发布问题有助于自己找到答案:)

在AWS Api Gateway模板中,我将正文设置为

"body-json" : $input.body

该方法应返回完整的负载字符串。

但更重要的是,我阅读了格雷格对自己问题的回答,并将我的方法更改为:

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,并通过任何所需的JSON库(我使用Jackson FasterXML)将其读取为 JsonNode。然后,所有可能的参数都会被打包在单个JSON中(按照模板指定的方式)。

{
    "body-json": {
        "firstName": "Mr",
        "lastName": "Awesome"
    },
    "params": {
       ...
    },
    "stage-variables": {
       ...
    },
    "context": {
        ...
    }
}

我能够使用 $input.body 创建一个 post 请求。但是,如果我的负载是 Json 格式的,$input.json('$') 的作用是什么?在阅读 AWS 网站上的以下文档时,我该如何解释它。https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#context-variable-reference以及https://goessner.net/articles/JsonPath/我尝试从 Lambda 中检索 Json,但它给了我一个空的花括号。 - Arpan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接