【发布时间】:2019-09-16 14:03:15
【问题描述】:
我正在从 AWS API Gateway 调用 AWS Lambda 函数。返回的 JSON 需要压缩,因为它有时会变得太大(主体尺寸太大等)。但是,我在通过 API 网关获取响应时遇到了一些问题。这是我的 Java 代码:
@Override
public JSONObject handleRequest(Object input, Context context) {
String json_string = "";
try {
Gson gson = new Gson();
json_string = gson.toJson(input, LinkedHashMap.class);
} catch (ClassCastException ex) {
json_string = (String) input;
}
GenerateJson generateJson = new GenerateJson ();
String body = "";
try {
JSONParser parser = new JSONParser();
Object jsonObj = parser.parse(json_string);
JSONObject matchesobj = (JSONObject) jsonObj;
if (matchesobj.containsKey("body")) {
body = (String) matchesobj.get("body");
} else {
JSONObject error = new JSONObject();
error.put("error", "No body with Base64 data in Request.");
System.out.println(error.toJSONString());
return error;
}
} catch (ParseException ex) {
ex.printStackTrace();
}
byte[] decodedBytes = Base64.getDecoder().decode(body);
String decodedString = new String(decodedBytes);
// System.out.println(decodedString);
JSONObject json = generateJson .getJson(decodedString, "", 2);
JSONObject returnObject = new JSONObject();
JSONObject headers = new JSONObject();
returnObject.put("statusCode", 205);
returnObject.put("isBase64Encoded", true);
// returnObject.put("Content-Encoding", "gzip");
returnObject.put("headers", headers);
returnObject.put("body", compressStringAndReturnBase64(json.toString()));
return (returnObject);
}
public static String compressStringAndReturnBase64(String srcTxt) {
ByteArrayOutputStream rstBao = new ByteArrayOutputStream();
GZIPOutputStream zos;
try {
zos = new GZIPOutputStream(rstBao);
zos.write(srcTxt.getBytes());
IOUtils.closeQuietly(zos);
byte[] bytes = rstBao.toByteArray();
String base64comp = Base64.getEncoder().encodeToString(bytes);
System.out.println("Json String is " + srcTxt.toString().getBytes().length + " compressed " + bytes.length + " compressed Base64 " + base64comp.getBytes().length);
return base64comp;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
我检查了 Base64 输出,它似乎工作正常(将其粘贴在 https://www.base64decode.org/ 中)。此外,当我与 Postman 核对时,如果我将响应保存到以 .gz 结尾的内容,我会得到一个可以用 7-zip 解压缩的二进制 blob。
在设置下,API Gateway Binary Media Types 已设置为 / 但我想让客户“看到”它是 GZIPped 并即时解码。但是,当我添加行时
returnObject.put("Content-Encoding", "gzip");
我收到 {"message": "Internal server error"} 并在 AWS API 日志中:由于配置错误,执行失败:格式错误的 Lambda 代理响应
Lambda 日志很好,所以它确实执行成功了,只是无法返回。
我认为我需要在 API 网关方面进行更多调整,有什么想法吗?
【问题讨论】:
-
你能展示全班吗?我在看
public class XXXX implements ........你在实现什么接口? -
Content-Encoding属于headers,而不是returnObject中的顶级键。看来您将其放在错误的位置是在构建格式不正确的响应。 -
迈克尔,你的评论成功了!但我不能将其标记为答案?
标签: aws-lambda aws-api-gateway