无法将API网关与aws lambda

时间:2017-08-07 00:54:02

标签: amazon-web-services amazon-s3 aws-lambda aws-api-gateway

我正在尝试将AWS API Gateway与AWS lambda函数集成。整合工作完美无缺,直到我使用Lambda Proxy集成'在我的集成请求中。

当我检查'使用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星期一08年8月7日00:33:45   UTC 2017:转换前的端点响应正文:   &#34; {\&#34; isBase64Encoded \&#34;:false,\&#34; statusCode \&#34;:200,\&#34; headers \&#34;:null,   \&#34; body \&#34;:\&#34; n10k_website资源库上传到S3 \&#34;}&#34;

     

Mon Aug 07 00:33:45 UTC 2017:端点响应标头:   {X-AMZN重新映射-Content-Length的= 0,   的x AMZN-的requestId = 0ff74e9d-7b08-11e7-9234-a1a04edc223f,   Connection = keep-alive,Content-Length = 121,Date = Mon,2017年8月7日   00:33:45 GMT,   X-AMZN-痕量-ID =根= 1-5987b565-7a66a2fd5fe7a5ee14c22633;采样= 0,   内容类型=应用/ JSON}

     

Mon Aug 07 00:33:45 UTC 2017:由于配置导致执行失败   错误:格式错误的Lambda代理响应

     

Mon Aug 07 00:33:45 UTC 2017:方法已完成,状态:502

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

1 个答案:

答案 0 :(得分: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\"}";
    }
} 

希望这有助于某人!