首页 文章

从AWS Gateway获取映射模板作为AWS Lambda Java Project中的JSON

提问于
浏览
2

我已经设置了一个与简单的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 回答

  • 1

    您可以编写自己的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;
        }
    
        ....
    }
    

    如果您想要完整的代理请求POJO,可以从here找到它们 .

  • 2

    感谢Ka Hou leong的指导,我解决了以下问题:

    1)在Maven中为aws-serverless-java-container添加了依赖项

    <dependency>
        <groupId>com.amazonaws.serverless</groupId>
        <artifactId>aws-serverless-java-container-core</artifactId>
        <version>0.4</version>
    </dependency>
    

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

    3)修改了我的API网关方法集成请求设置以使用Lambda代理集成 .

    从这里我可以访问输入对象中的所有内容作为AwsProxyRequest,并将作为AwsProxyResponse操作响应与我想要响应的任何内容 .

相关问题