Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在AWS Lambda Java项目中以JSON形式从API网关获取映射模板_Java_Json_Amazon Web Services_Lambda_Aws Api Gateway - Fatal编程技术网

在AWS Lambda Java项目中以JSON形式从API网关获取映射模板

在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网关

我已经设置了一个API网关GET方法,该方法集成了一个简单的AWS Lambda函数。我已经在集成请求上启用了请求体传递,并将其传递到预设的方法请求传递模板

我想根据请求的资源路径做不同的事情。例如,如果路径是/foo,我将使用相同的Lambda函数解释foo请求,或者/bar将解释为bar请求。因此,我需要根据Lambda函数本身中的资源路径进行切换

我无法访问映射的有效负载模板。所有的数据都应该在那里。但在java中,我不知道如何使用Jackson、org.json或json路径将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;
}

}
但我得到了:

{
"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;
    }
}