我已经设置了一个与简单的AWS Lambda函数集成的API Gateway GET方法 . 我已经在集成请求上启用了Request Body Passthrough到预先设置的Method request passthrough模板 .
我想根据请求的资源路径做不同的事情 . 例如,如果路径是/ foo,我将解释foo请求,或者/ bar将解释为bar请求,具有相同的Lambda函数 . 所以我需要根据Lambda函数本身的资源路径进行切换 .
我无法访问映射的有效负载模板 . 根据AWS help,所有数据都应该在那里 . 但在java中,我无法弄清楚如何使用Jackson,org.json或json-path将输入从API网关转换为可解析的json .
这是我的Lambda代码 . 任何有关如何从API网关GET获取“资源路径”或任何方法请求直通的帮助将不胜感激 .
import org.json.JSONObject;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaFunctionHandler implements RequestHandler<Object, Object> {
@Override
public Object handleRequest(Object input, Context context) {
JSONObject inputJson = new JSONObject(input.toString());
JSONObject contextJson = inputJson.getJSONObject("context");
String resourcePath = contextJson.getString("resource-path");
return resourcePath;
}
}
以下是我认为将其作为输入发送到函数中:
{
"body-json" : {},
"params" : {
"path" : {},
"querystring" : {},
"header" : {}
},
"stage-variables" : {},
"context" : {
"account-id" : "xxxxxxxxx",
"api-id" : "xxxxxxxxx",
"api-key" : "xxxxxxxxx",
"authorizer-principal-id" : "",
"caller" : "xxxxxxxxx",
"cognito-authentication-provider" : "",
"cognito-authentication-type" : "",
"cognito-identity-id" : "",
"cognito-identity-pool-id" : "",
"http-method" : "GET",
"stage" : "test-invoke-stage",
"source-ip" : "test-invoke-source-ip",
"user" : "xxxxxxxxxxxxxxxx",
"user-agent" : "Apache-HttpClient/4.5.x (Java/1.8.0_112)",
"user-arn" : "arn:aws:iam::230537478972:root",
"request-id" : "test-invoke-request",
"resource-id" : "75bakm",
"resource-path" : "/text"
}
}
但是我得到了:
{
"errorMessage": "Expected a ':' after a key at 11 [character 12 line 1]",
"errorType": "org.json.JSONException",
"stackTrace": [
"org.json.JSONTokener.syntaxError(JSONTokener.java:433)",
"org.json.JSONObject.<init>(JSONObject.java:216)",
"org.json.JSONObject.<init>(JSONObject.java:323)",
"xxx.LambdaFunctionHandler.handleRequest(LambdaFunctionHandler.java:12)"
]
}
2 回答
您可以编写自己的POJO以匹配来自API网关的请求,然后您就可以从getter访问资源路径 .
POJO示例:
如果您想要完整的代理请求POJO,可以从here找到它们 .
感谢Ka Hou leong的指导,我解决了以下问题:
1)在Maven中为aws-serverless-java-container添加了依赖项
2)修改了我的LambdaFunctionHandler类以使用AwsProxyRequest和AwsProxyResponse:
3)修改了我的API网关方法集成请求设置以使用Lambda代理集成 .
从这里我可以访问输入对象中的所有内容作为AwsProxyRequest,并将作为AwsProxyResponse操作响应与我想要响应的任何内容 .