8

我试图在新的 Java HTTP 客户端中找到任何关于压缩处理的提及,但失败了。gzip是否有用于处理例如或deflate压缩的内置配置?

我希望有一个BodyHandler例如这样的东西:

HttpResponse.BodyHandlers.ofGzipped(HttpResponse.BodyHandlers.ofString())

但我没有看到。我也没有看到任何配置HttpClient。我是在找错地方了,还是故意没有实现并推迟到支持库?

4

3 回答 3

11

我也很惊讶新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.

于 2019-01-06T17:37:03.590 回答
3

不,默认情况下不处理 gzip/deflate 压缩。如果需要,您必须在您的应用程序代码中实现它 - 例如,通过提供定制BodySubscriber的来处理它。或者-您可能想看看那里的一些反应流库是否提供了这样的功能,在这种情况下,您可以使用其中一种BodyHandlers.fromSubscriber​(Flow.Subscriber<? super List<ByteBuffer>> subscriber)BodyHandlers.ofPublisher()方法将其导入。

于 2018-11-29T14:25:27.767 回答
3

您可以使用甲醇。它具有解压缩 实现,对&BodyHandler具有开箱即用的支持。还有一个用于 brotli的模块。gzipdeflate

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
于 2020-04-17T19:31:06.127 回答