Имеет ли сжатие Java HTTP Client ручки

голоса
4

Я пытался найти какое - либо упоминание о обработке сжатия в новом Java HTTP Client , но не удался. Есть встроенный в конфигурации для обработки для , например , gzipили deflateсжатия?

Я бы ожидать , чтобы иметь BodyHandler, например , для чего - то вроде этого:

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

но я не вижу. Я не вижу никакой конфигурации в HttpClientтоже. Могу ли я смотрю в неправильном месте или был намеренно это не реализовано и отложено до поддержки библиотек?

Задан 27/11/2018 в 15:11
источник пользователем
На других языках...                            


2 ответов

голоса
2

Я также был удивлен , что новая java.net.httpструктура не обрабатывает это автоматически, но следующие работы для меня , чтобы обрабатывать ответы 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», добавив проверку на выше блок переключателей и обертывание httpResponse.body()в InflaterInputStream.

Ответил 06/01/2019 в 17:37
источник пользователем

голоса
1

Нет, сжатие GZIP / выкачивает не обрабатываются по умолчанию. Вы бы осуществить это в коде приложения , если вам это нужно - например, предоставляя настроенное BodySubscriberсправиться с этим. В качестве альтернативы - вы можете взглянуть на ли некоторые из реактивных библиотек потока там предлагают такую возможность, в этом случае вы можете быть в состоянии трубы , что в системе с помощью одного из BodyHandlers.fromSubscriber​(Flow.Subscriber<? super List<ByteBuffer>> subscriber)или BodyHandlers.ofPublisher()методов.

Ответил 29/11/2018 в 14:25
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more