首页 文章

无法将API网关与aws lambda集成

提问于
浏览
0

我正在尝试将AWS API Gateway与AWS lambda函数集成 . 在我的集成请求中使用“Lambda代理集成”之前,集成工作完美无瑕 .

当我在集成请求中检查“使用Lambda代理集成”时,我开始得到:

“由于配置错误导致执行失败:格式错误的Lambda代理响应”

我google了一下,意识到我需要以某种格式发回响应:

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}

然而,尽管如此,我仍然继续看到同样的错误 . 我究竟做错了什么?

这就是我的Lambda函数的样子:

@Override
    public String handleRequest(Object input, Context context) {
        context.getLogger().log("Input: " + input);
        return uploadN10KWebsiteRepositoryToS3();
    }

    private String uploadN10KWebsiteRepositoryToS3() {
        /*BitbucketToS3Upload.JsonResponse jsonResponse = new BitbucketToS3Upload.JsonResponse();
        jsonResponse.body = "n10k_website repository uploaded to S3...";
        String jsonString = null;
        try {
            ObjectMapper mapper = new ObjectMapper();
            jsonString = mapper.writeValueAsString(jsonResponse);

            HashMap<String, Object> test = new HashMap<String, Object>();
            test.put("statusCode", 200);
            test.put("headers", null);
            test.put("body", "n10k_website repository uploaded to S3");
            test.put("isBase64Encoded", false);

            jsonString = mapper.writeValueAsString(test);
        }
        catch (Exception e) {
            int i = 0;
        }*/

        //return jsonString;
        return "{\"isBase64Encoded\":false, \"statusCode\":200, \"headers\":null, \"body\": \"n10k_website repository uploaded to S3\"}";
    }

当我从API网关控制台测试API时,这是我得到的响应:

收到回复 . 集成延迟:4337 ms星期一07月08日00:33:45 UTC 2017:转换前的 endpoints 响应正文:“{\”isBase64Encoded \“:false,\”statusCode \“:200,\”headers \“:null,\” body \“:\”n10k_website repository上传到S3 \“}”Mon Aug 07 00:33:45 UTC 2017: endpoints 响应头:{x-amzn-Remapped-Content-Length = 0,x-amzn-RequestId = 0ff74e9d -7b08-11e7-9234-a1a04edc223f,Connection = keep-alive,Content-Length = 121,Date = Mon,07 Aug 2017 00:33:45 GMT,X-Amzn-Trace-Id = root = 1-5987b565-7a66a2fd5fe7a5ee14c22633 ; samples = 0,Content-Type = application / json} Mon Aug 07 00:33:45 UTC 2017:由于配置错误导致执行失败:格式错误的Lambda代理响应Mon Aug 07 00:33:45 UTC 2017:方法已完成,状态为:502

如果我取消选中“使用Lambda代理集成”,一切正常 . 但我想知道为什么我的回答是错误的以及如何解决它 . 谢谢!

1 回答

  • 2

    我想到了 . 我以错误的方式发回了回复 .

    响应必须直接作为POJO对象发回,而不是序列化POJO并将其作为String发回 . 这就是我开始工作的方式 .

    public class BitbucketToS3Upload implements RequestHandler<Object, JsonResponse> {
    
        @Data
        public static class JsonResponse {
            boolean isBase64Encoded = false;
            int statusCode = HttpStatus.SC_OK;
            String headers = null;
            String body = null;
        }
    
        @Override
        public JsonResponse handleRequest(Object input, Context context) {
            context.getLogger().log("Input: " + input);
    
            return uploadN10KWebsiteRepositoryToS3();
        }
    
        private JsonResponse uploadN10KWebsiteRepositoryToS3() {
            BitbucketToS3Upload.JsonResponse jsonResponse = new BitbucketToS3Upload.JsonResponse();
            jsonResponse.body = "n10k_website repository uploaded to S3";
            String jsonString = null;
            try {
                ObjectMapper mapper = new ObjectMapper();
                jsonString = mapper.writeValueAsString(jsonResponse);
    
                System.out.println(jsonString);
    
                //jsonString = mapper.writeValueAsString(test);
            }
            catch (Exception e) {
                int i = 0;
            }
    
            return jsonResponse;
            //return "{\"isBase64Encoded\":false, \"statusCode\":200, \"headers\":null, \"body\": \"n10k_website repository uploaded to S3\"}";
        }
    }
    

    希望这有助于某人!

相关问题