如何将 API Gateway API 中的路径参数映射到 Java Lambda 的请求对象

Posted

技术标签:

【中文标题】如何将 API Gateway API 中的路径参数映射到 Java Lambda 的请求对象【英文标题】:How do I map path parameters from an API Gateway API to the Request Object of a Java Lambda 【发布时间】:2019-09-04 15:15:16 【问题描述】:

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


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

当我通过带有这样一个对象的测试接口调用这个 Lambda 时,它工作正常。

我想创建一个 API,其中有一个 GET 请求

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

即形式

/users/userId/items/id

调用这个 Lambda。

我已经适当地创建了 API 资源 /usersuserIditemsid

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

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

我尝试过创建模板映射(并尝试过 RTFM),但看不到如何将路径参数映射到正文。

如何实现这种映射?

【问题讨论】:

【参考方案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。本教程类似地通过解析输入而不是使用APIGatewayProxyRequestEvent java 类来访问pathParameters

@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);

    

【讨论】:

【参考方案2】:

使用映射模板。

首先,在“方法请求”部分,您应该看到 userIdid 作为请求路径

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

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


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

【讨论】:

以上是关于如何将 API Gateway API 中的路径参数映射到 Java Lambda 的请求对象的主要内容,如果未能解决你的问题,请参考以下文章

通过 API-Gateway 将动态路径传递给 AWS-Lambda

如何通过 REST API 在 Express Gateway 中使用多个路径和端点?

如何将 AWS CloudFront 和 API Gateway 并排用于同一个域?

从 AWS API Gateway 自定义域映射中删除映射路径

如何将无服务器代码部署到 AWS API Gateway 中的阶段

如何将 API Gateway 与 SQS 集成