You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala AWS Lambda中Gzip压缩JSON响应的Postman兼容问题

解决Scala AWS Lambda中Gzip压缩响应的Postman解压问题

我来帮你搞定这个问题,你遇到的核心问题是AWS Lambda对二进制响应的处理规则没匹配上,咱们一步步拆解:

问题根源

你现在直接把压缩后的字节数组放到响应体里,Lambda会把这个字节数组序列化成整数数组(就是你在控制台看到的那种[xxx, xxx,...]格式),Postman拿到这个后,尝试把它当成Gzip二进制数据解压,自然会报“incorrect header check”——因为这根本不是有效的Gzip字节流,而是JSON格式的整数列表。

正确的处理流程

AWS Lambda要求二进制响应必须满足两个条件:

  • 响应体是Base64编码的字符串
  • 响应里必须设置isBase64Encoded: true标识,告诉Lambda服务要把这个字符串解码回原始字节再发送给客户端

同时别忘了补充Content-Type: application/json头,让客户端明确知道解压后的数据类型。

修改后的Scala代码示例

先保留你原有的压缩方法,然后在构建响应时做Base64转换和响应结构调整:

import java.util.Base64
import java.io.{ByteArrayOutputStream, GZIPOutputStream}

// 你的原压缩方法不变
def compressString(content: String): Array[Byte] = { 
  val bos = new ByteArrayOutputStream() 
  val gzs = new GZIPOutputStream(bos) 
  gzs.write(content.getBytes("UTF-8")) 
  gzs.close() 
  val compressed = bos.toByteArray 
  bos.close() 
  compressed 
}

// 构建Lambda响应的逻辑
def buildCompressedResponse(myJson: Any): Map[String, Any] = {
  // 1. 压缩JSON字符串
  val compressedBytes = compressString(myJson.toString())
  // 2. 把字节数组转成Base64编码的字符串
  val base64Compressed = Base64.getEncoder.encodeToString(compressedBytes)
  
  // 3. 构建符合Lambda要求的响应结构
  Map(
    "statusCode" -> 200,
    "headers" -> Map(
      "Content-Encoding" -> "gzip",
      "Content-Type" -> "application/json"
    ),
    "isBase64Encoded" -> true, // 这个字段必须加!
    "body" -> base64Compressed
  )
}

验证效果

  1. 用Postman调用时,记得带上Accept-Encoding: gzip请求头
  2. Postman会自动识别响应的Content-Encoding头,自动解压Base64解码后的字节流,你就能看到正常的JSON内容了
  3. Scala客户端调用时,只要请求头带上Accept-Encoding: gzip,收到响应后先处理Base64解码(如果是直接调用Lambda API的话),或者直接解压HTTP响应的字节流(如果是通过API Gateway转发的话),就能正常解析JSON

内容的提问来源于stack exchange,提问作者skal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:31:14