java - Java HTTP Client 是否处理压缩

标签 java java-11 java-http-client

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

我希望有一个 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/

相关文章:

java - JDK-11 在日期格式中引入逗号

Java 11 和雅各布。 ClassNotFoundException : javax. rmi.CORBA. stub

java - jdk.incubator.httpclient 中的 NullPointerException

java - 当文件是目录时,文件 isDirectory() 给出 false

java - Tomcat 失败并出现 UnrecoverableKeyException : Cannot recover key

java - 从 Scanner 将数字添加到数组

java - 在 Java 11 中反序列化 XStream XML 时出错 - 无法通过 JDK 序列化创建 java.beans.PropertyChangeSupport : null

java - 如何在 Java8 项目中使用 Http Client API(自 Java 9 起)

java - 如何使用 Java Http 客户端发送带有 multipart/form-data 主体的 PUT 请求?

java - 使用包含另一个类作为属性的对象的构造函数