在AWS Lambda Java项目中以JSON形式从API网关获取映射模板
我已经设置了一个API网关GET方法,该方法集成了一个简单的AWS Lambda函数。我已经在集成请求上启用了请求体传递,并将其传递到预设的方法请求传递模板 我想根据请求的资源路径做不同的事情。例如,如果路径是/foo,我将使用相同的Lambda函数解释foo请求,或者/bar将解释为bar请求。因此,我需要根据Lambda函数本身中的资源路径进行切换 我无法访问映射的有效负载模板。所有的数据都应该在那里。但在java中,我不知道如何使用Jackson、org.json或json路径将API网关的输入转换为可解析的json 这是我的Lambda代码。对于如何从API网关get获取“资源路径”或任何方法请求传递的任何帮助,我们将不胜感激在AWS Lambda Java项目中以JSON形式从API网关获取映射模板,java,json,amazon-web-services,lambda,aws-api-gateway,Java,Json,Amazon Web Services,Lambda,Aws Api Gateway,我已经设置了一个API网关GET方法,该方法集成了一个简单的AWS Lambda函数。我已经在集成请求上启用了请求体传递,并将其传递到预设的方法请求传递模板 我想根据请求的资源路径做不同的事情。例如,如果路径是/foo,我将使用相同的Lambda函数解释foo请求,或者/bar将解释为bar请求。因此,我需要根据Lambda函数本身中的资源路径进行切换 我无法访问映射的有效负载模板。所有的数据都应该在那里。但在java中,我不知道如何使用Jackson、org.json或json路径将API网关
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;
}
}
但我得到了:
{
"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)"
]
}
{
“errorMessage:“在11[字符12第1行]处的键后应为“:”,
“errorType”:“org.json.JSONException”,
“stackTrace”:[
“org.json.JSONTokener.syntaxError(JSONTokener.java:433)”,
“org.json.JSONObject.(JSONObject.java:216)”,
“org.json.JSONObject.(JSONObject.java:323)”,
“xxx.lambdFunctionHandler.HandlerRequest(lambdFunctionHandler.java:12)”
]
}
您可以编写自己的POJO以匹配来自API网关的请求,然后您将能够从getter访问资源路径
POJO示例:
public class LambdaFunctionHandler implements RequestHandler<Object, Object> {
@Override
public Object handleRequest(AwsProxyRequest input, Context context) {
String resourcePath = input.getRequestContext().getResourcePath();
return resourcePath;
}
}
public class AwsProxyRequest {
//-------------------------------------------------------------
// Variables - Private
//-------------------------------------------------------------
private ApiGatewayRequestContext requestContext;
....
//-------------------------------------------------------------
// Methods - Getter/Setter
//-------------------------------------------------------------
public ApiGatewayRequestContext getRequestContext() {
return requestContext;
}
public void setRequestContext(ApiGatewayRequestContext requestContext) {
this.requestContext = requestContext;
}
....
}
public class ApiGatewayRequestContext {
//-------------------------------------------------------------
// Variables - Private
//-------------------------------------------------------------
private String resourcePath;
...
//-------------------------------------------------------------
// Methods - Getter/Setter
//-------------------------------------------------------------
public String getResourcePath() {
return resourcePath;
}
public void setResourcePath(String resourcePath) {
this.resourcePath = resourcePath;
}
....
}
public类LambdaFunctionHandler实现RequestHandler{
@凌驾
公共对象handleRequest(AwsProxyRequest输入,上下文){
字符串resourcePath=input.getRequestContext().getResourcePath();
返回资源路径;
}
}
公共类AwsProxyRequest{
//-------------------------------------------------------------
//变量-私有
//-------------------------------------------------------------
私有ApiGatewayRequestContext-requestContext;
....
//-------------------------------------------------------------
//方法-Getter/Setter
//-------------------------------------------------------------
公共ApiGatewayRequestContext getRequestContext(){
返回请求上下文;
}
public void setRequestContext(ApiGatewayRequestContext requestContext){
this.requestContext=requestContext;
}
....
}
公共类ApiGatewayRequestContext{
//-------------------------------------------------------------
//变量-私有
//-------------------------------------------------------------
私有字符串资源路径;
...
//-------------------------------------------------------------
//方法-Getter/Setter
//-------------------------------------------------------------
公共字符串getResourcePath(){
返回资源路径;
}
public void setResourcePath(字符串resourcePath){
this.resourcePath=resourcePath;
}
....
}
如果您想要完整的代理请求POJO,您可以从中找到它们。感谢Ka Hou leong的指导,我已经解决了以下问题: 1) 在Maven中为
com.amazonaws.serverless
aws无服务器java容器核心
0.4
2) 修改LambdaFunctionHandler类以使用AwsProxyRequest和AwsProxyResponse:
import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest;
import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaFunctionHandler implements RequestHandler<AwsProxyRequest, Object> {
public Object handleRequest(AwsProxyRequest input, Context context) {
AwsProxyResponse response = new AwsProxyResponse();
String resourcePath = input.getRequestContext().getResourcePath();
response.setStatusCode(200);
response.setBody(resourcePath);
return response;
}
}
import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest;
导入com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse;
导入com.amazonaws.services.lambda.runtime.Context;
导入com.amazonaws.services.lambda.runtime.RequestHandler;
公共类lambdFunctionHandler实现RequestHandler{
公共对象handleRequest(AwsProxyRequest输入,上下文){
AWSProxy响应=新的AWSProxy响应();
字符串resourcePath=input.getRequestContext().getResourcePath();
响应。设置状态代码(200);
response.setBody(resourcePath);
返回响应;
}
}
3) 修改了我的API网关方法集成请求设置,以使用Lambda代理集成
从这里,我可以以AwsProxyRequest的形式访问输入对象中的所有内容,并将以AwsProxyResponse的形式对响应进行操作,以处理我想要响应的任何内容 对!!这项工作进行了一些小的调整。回答我自己要解释的问题。见下面我的答案。我必须在maven中添加依赖项,更改输入类型,然后重新配置API网关以使用lambda代理集成。感谢您指向aws无服务器java容器,这就是我要找的!
<dependency>
<groupId>com.amazonaws.serverless</groupId>
<artifactId>aws-serverless-java-container-core</artifactId>
<version>0.4</version>
</dependency>
import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest;
import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaFunctionHandler implements RequestHandler<AwsProxyRequest, Object> {
public Object handleRequest(AwsProxyRequest input, Context context) {
AwsProxyResponse response = new AwsProxyResponse();
String resourcePath = input.getRequestContext().getResourcePath();
response.setStatusCode(200);
response.setBody(resourcePath);
return response;
}
}