如何将 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 资源 /users
、userId
、items
和 id
。
我创建了 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】:使用映射模板。
首先,在“方法请求”部分,您应该看到 userId
和 id
作为请求路径
然后,在集成请求中,不要选择代理集成。
然后在 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 自定义域映射中删除映射路径