我试图在新的 Java HTTP 客户端中找到任何关于压缩处理的提及,但失败了。是否有内置配置来处理例如gzip
或 deflate
压缩?
我希望有一个 BodyHandler
用于例如像这样:
HttpResponse.BodyHandlers.ofGzipped(HttpResponse.BodyHandlers.ofString())
但我没看到。我也没有在 HttpClient
中看到任何配置。我是不是找错地方了,或者这是故意没有实现并推迟到支持图书馆?
最佳答案
令我惊讶的是,新的 java.net.http
框架没有自动处理这个问题,但下面的代码对我来说可以处理作为 InputStream< 接收的 HTTP 响应
并且未压缩或使用 gzip 压缩:
public static InputStream getDecodedInputStream(
HttpResponse<InputStream> httpResponse) {
String encoding = determineContentEncoding(httpResponse);
try {
switch (encoding) {
case "":
return httpResponse.body();
case "gzip":
return new GZIPInputStream(httpResponse.body());
default:
throw new UnsupportedOperationException(
"Unexpected Content-Encoding: " + encoding);
}
} catch (IOException ioe) {
throw new UncheckedIOException(ioe);
}
}
public static String determineContentEncoding(
HttpResponse<?> httpResponse) {
return httpResponse.headers().firstValue("Content-Encoding").orElse("");
}
请注意,我没有添加对“deflate”类型的支持(因为我目前不需要它,而且我对“deflate”的了解越多,听起来越乱)。但我相信您可以通过向上述开关 block 添加检查并将 httpResponse.body()
包装在 InflaterInputStream
中来轻松支持“放气”。
关于java - Java HTTP Client 是否处理压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53502626/