如何将路径参数从API网关API映射到Java Lambda的请求对象

时间:2019-04-14 13:09:18

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

我有一个用Java编写的lambda,可以接受结构为的请求对象

{
  "id": "be1c320a-144f-464d-b32c-38ec7fb4445b",
  "userId": "foobar"
}

当我通过测试界面使用此类对象调用此Lambda时,它工作正常。

我想创建一个GET请求

的API
/users/foobar/items/be1c320a-144f-464d-b32c-38ec7fb4445b

即形式

/users/{userId}/items/{id}

称之为Lambda。

我已经适当地创建了API资源/users{userId}items{id}

我已经创建了GET方法(在/users/{userId}/items/{id}上)并将其与lambda关联。

当我测试API时,它会调用lambda,但请求中的值为空。我可以看到它在日志中将path打包为{"id":"be1c320a-144f-464d-b32c-38ec7fb4445b","userId": "foobar"},但没有在正文中发送。

我已经尝试创建模板映射(并尝试过RTFM),但是看不到如何将路径参数映射到主体。

如何实现此映射?

2 个答案:

答案 0 :(得分:1)

我认为您的请求对象结构可能未正确配置。可能有几种方法可以配置它。这是一些对我有帮助的信息。

How to pass a querystring or route parameter to AWS Lambda from Amazon API Gateway-演示此映射(尽管使用python)。但是,如果使用顶部response,则如果启用“使用Lambda代理集成”,则可以类似地使用Java:

@Override
public Object handleRequest(APIGatewayProxyRequestEvent input, Context context) {

    Map<String, String> pathParameters = input.getPathParameters();
    String id = pathParameters.get("id");
    String userId = pathParameters.get("userId");

    // Handle rest of request..

}

这是tuturial using the serverless framework,用于使用Java创建Api。本教程类似地通过解析输入而不是使用pathParameters Java类来访问APIGatewayProxyRequestEvent

@Override
public Object handleRequest(Map<String, Object> input, Context context) {

    try {
        // get the 'pathParameters' from input
        Map<String,String> pathParameters =  (Map<String,String>)input.get("pathParameters");
        String id = pathParameters.get("id");
        String userId = pathParameters.get("userId");

    } catch (Exception ex) {
        logger.error("Error in retrieving product: " + ex);

    }
}

答案 1 :(得分:0)

使用映射模板。

首先,在“方法请求”部分,您应该将userIdid视为请求路径

然后,在“集成请求”中,不要选择“代理集成”。

然后在“映射模板”部分中,为表单的application/json添加一个新的映射模板

{
  "id"     : "$method.request.path.id",
  "userId" : "$method.request.path.user_id"
}