我有一个用Java编写的lambda,可以接受结构为的请求对象
{
"id": "be1c320a-144f-464d-b32c-38ec7fb4445b",
"userId": "foobar"
}
当我通过测试界面使用此类对象调用此Lambda时,它工作正常。
我想创建一个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),但是看不到如何将路径参数映射到主体。
如何实现此映射?
答案 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)
使用映射模板。
首先,在“方法请求”部分,您应该将userId
和id
视为请求路径
然后,在“集成请求”中,不要选择“代理集成”。
然后在“映射模板”部分中,为表单的application/json
添加一个新的映射模板
{
"id" : "$method.request.path.id",
"userId" : "$method.request.path.user_id"
}