我正在尝试将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;,一切正常。但我想知道为什么我的回答是错误的以及如何解决它。谢谢!
答案 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\"}";
}
}
希望这有助于某人!