Est-ce que Java HTTP compression poignée client

voix
4

J'ai essayé de trouver toute mention de manipulation de compression dans le nouveau client Java HTTP mais a échoué. Y at - il une configuration intégrée à gérer pour par exemple gzipou la deflatecompression?

J'attendre d'avoir un BodyHandlerpour exemple quelque chose comme ceci:

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

mais je ne vois pas. Je ne vois aucune configuration HttpClientnon plus . Est-ce que je cherche au mauvais endroit ou était - ce volontairement pas mis en œuvre et les impôts différés aux bibliothèques de soutien?

Créé 27/11/2018 à 15:11
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

Je suis aussi surpris que le nouveau java.net.httpcadre ne gère pas automatiquement, mais les œuvres suivantes pour moi de gérer les réponses HTTP qui sont reçues en tant InputStreamet sont compressés ou non compressés avec 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("");
}

Notez que je ne l' ai pas ajouté le support pour le type « dégonfler » (parce que je ne pas encore avoir besoin, et plus je lis sur « dégonfler » plus d'un gâchis ça sonnait). Mais je crois que vous pouvez facilement soutenir « dégonfler » en ajoutant un chèque au bloc de commutation ci - dessus et enveloppant le httpResponse.body()dans un InflaterInputStream.

Créé 06/01/2019 à 17:37
source utilisateur

voix
1

Non, la compression gzip / deflate ne sont pas pris en charge par défaut. Vous auriez à mettre en œuvre que dans votre code d'application si vous en avez besoin - par exemple en fournissant un personnalisé BodySubscriberpour y faire face. Sinon - vous pouvez jeter un oeil à savoir si certaines des bibliothèques de flux réactifs offrent là une telle fonctionnalité, dans ce cas , vous pourriez être en mesure de tuyau en en utilisant l' une des BodyHandlers.fromSubscriber​(Flow.Subscriber<? super List<ByteBuffer>> subscriber)ou BodyHandlers.ofPublisher()méthodes.

Créé 29/11/2018 à 14:25
source utilisateur

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