我试图在新的 Java HTTP 客户端中找到任何关于压缩处理的提及,但失败了。gzip
是否有用于处理例如或deflate
压缩的内置配置?
我希望有一个BodyHandler
例如这样的东西:
HttpResponse.BodyHandlers.ofGzipped(HttpResponse.BodyHandlers.ofString())
但我没有看到。我也没有看到任何配置HttpClient
。我是在找错地方了,还是故意没有实现并推迟到支持库?
我试图在新的 Java HTTP 客户端中找到任何关于压缩处理的提及,但失败了。gzip
是否有用于处理例如或deflate
压缩的内置配置?
我希望有一个BodyHandler
例如这样的东西:
HttpResponse.BodyHandlers.ofGzipped(HttpResponse.BodyHandlers.ofString())
但我没有看到。我也没有看到任何配置HttpClient
。我是在找错地方了,还是故意没有实现并推迟到支持库?
我也很惊讶新java.net.http
框架不能自动处理这个问题,但以下内容对我来说可以处理作为 an 接收的 HTTP 响应,这些响应InputStream
要么是未压缩的,要么是使用 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”的了解越多,它听起来就越混乱)。但我相信你可以通过在上面的 switch 块中添加一个检查httpResponse.body()
并将InflaterInputStream
.
不,默认情况下不处理 gzip/deflate 压缩。如果需要,您必须在您的应用程序代码中实现它 - 例如,通过提供定制BodySubscriber
的来处理它。或者-您可能想看看那里的一些反应流库是否提供了这样的功能,在这种情况下,您可以使用其中一种BodyHandlers.fromSubscriber(Flow.Subscriber<? super List<ByteBuffer>> subscriber)
或BodyHandlers.ofPublisher()
方法将其导入。
您可以使用甲醇。它具有解压缩 实现,对&BodyHandler
具有开箱即用的支持。还有一个用于 brotli的模块。gzip
deflate
var response = client.send(request, MoreBodyHandlers.decoding(BodyHandlers.ofString()));
请注意,您可以使用任何BodyHandler
您想要的。MoreBodyHandlers::decoding
让您的处理程序看起来好像响应从未被压缩!它负责Content-Encoding
标题和所有内容。
更好的是,您可以使用 Methanol 自己的HttpClient
,它在将适当的内容添加Accept-Encoding
到您的请求后进行透明解压。
var client = Methanol.create();
var request = MutableRequest.GET("https://example.com");
var response = client.send(request, BodyHandlers.ofString()); // The response is transparently decompressed