0

我正在尝试发送包含压缩(gzip)流输出的响应。我当前的代码是:

@Path("/")
@Get
@Produces(MediaType.APPLICATION_JSON)
fun testRessource() : Response {
   val streamingOutput = TestOutputStream()
   val gzipStreamingOutput = CompressedHttpOutputStream(streamingOutput)
   val response = Response.ok(gzipStreamingOutput)
   response.setHeader("Content-Encoding", "gzip")

   return response
}

class TestOutputStream() : StreamingOutput {
   override fun write(outputStream: OutputStream) {
       val writer = BufferedWriter(OutputStreamWriter(outputStream))
       writer.write("{ "id" : 5 }")
       writer.flush()
   }
}


class CompressedHttpOutputStream(private val streamingOutput: StreamingOutput) : StreamingOutput {
    override fun write(outputStream: OutputStream) {
        val os = GZIPOutputStream(outputStream)
        streamingOutput.write(os)
        os.finish()
    }
}

当我请求此服务时,我的浏览器中会出现乱码数据。即使我的响应正确设置了以下标头,我似乎也遗漏了一些东西:Content-Encoding:gzip 和 Transfer-encoding:chunked。

在我放心的单元测试中,如果我提取正文并通过 GzipInputStream() 读取它,我可以检索 json 正文。

当我更换:

val os = GZIPOutputStream(outputStream)

val os = DeflaterOutputStream(outputStream) and Content-Encoding : deflate

输出正确解压为 json。

我正在使用 Quarkus 2.6.0.Final。

感谢您的帮助和见解!

4

1 回答 1

0

没关系,不需要CompressedHttpOutputStreamQuarkus 实现了对 rest 端点的 gzip 支持

我只需要在端点和application.properties中添加@GZIP注释。quarkus.resteasy.gzip.enabled=true

于 2022-01-10T09:34:13.817 回答