【发布时间】:2022-01-07 13:44:13
【问题描述】:
我正在尝试发送包含压缩 (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。
感谢您的帮助和见解!
【问题讨论】:
-
根据the Java docs,可能需要添加
os.close()才能完成写流。
标签: java kotlin gzip quarkus streamingresponsebody