我正在尝试发送包含压缩(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。
感谢您的帮助和见解!