json Rest客户端不会自动解压缩压缩的响应

c2e8gylq  于 2023-03-13  发布在  其他
关注(0)|答案(2)|浏览(164)

我压缩我的JSON头如下:

ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream( out );
gzip.write( responseBody.encodePrettily().getBytes( "UTF-8" ) );
gzip.close();
byte[] bytes = out.toByteArray();
String response = Base64.getEncoder().encodeToString( bytes );

我从服务器发送这个响应,在任何浏览器上,响应都会自动解压缩并检索json数据,但是当在Postman、Insomnia或RestClient(Mozilla Addon)上发送GET请求时,我得到的是编码的gzip而不是json数据:

H4sIAAAAAAAAAM2POwvCMBSF90L/wyVzB9tmcnZxcLFuIiE0VwikD/IQpOS/20RL1cGt0vWcw/3uN6QJANFonLIE...

我怎么才能让它解压呢?我试过几个Rest客户端,它们都不像浏览器那样解压。
我找不到答案,我开始感到绝望。

guykilcj

guykilcj1#

您需要包含一个内容编码响应头字段,指示“gzip”(请参阅https://greenbytes.de/tech/webdav/rfc7231.html#data.encoding)

qmelpv7a

qmelpv7a2#

问题解决了!实际上没有必要像我在问题中所展示的那样手动压缩响应,因为我们使用的是Vert. X。
Vert.X提供了一个聪明的选项,可以在HttpServerOptions中设置,以便在可能的情况下自动进行压缩(即客户端支持压缩)。Postman和任何其他REST客户端(即浏览器或其他)获得压缩的响应并自动解压缩它!
我浪费了很多时间,但至少学到了一些有用的东西。这就是为什么我想与你分享。
如果您使用的是Vert.X,下面这行代码将为您完成这项工作:
HttpServerOptions options = new HttpServerOptions().setCompressionSupported( true );
然后在创建HttpServer时简单地使用这个HttpServerOptions示例:
HttpServer server = vertx.createHttpServer( options );
PS:你可以在检查客户端返回的响应头时验证压缩是否真的发生了。你会发现content-encoding : gzip

相关问题