首页 文章

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

提问于
浏览
8

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

我试图使用JSON作为有效负载向其中一个 endpoints 发出 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

但那又是"converts"到 key=value 而不是 key:value

How do I have to configure the template to simply pass me the body so I can use it in a JSON parser?

1 回答

  • 6

    再一次 - 只需在SO上发布一个问题就可以自己找到答案:)

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

    "body-json" : $input.body
    

    应该将完整的有效负载作为String返回 .

    但更重要的是我读了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 读取就足够了(我使用的是Jackson FasterXML) . 瞧,它将所有可能的参数打包在一个JSON中(由模板指定)

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

相关问题