Apache Commons HttpClient prend-il en charge GZIP?

La bibliothèque Apache Commons HttpClient prend-elle en charge Gzip? Nous voulions utiliser Activer la compression gzip sur notre serveur Apache pour accélérer les communications client/serveur (nous avons une page php qui permet à notre application Android de synchroniser des fichiers avec le serveur).

25
demandé sur Jonik 2010-05-06 01:55:46

7 réponses

Apache HttpClient 4.1 prend en charge la compression de contenu hors de la boîte ainsi que de nombreuses autres fonctionnalités qui étaient auparavant considérées comme hors de portée.

25
répondu oleg 2010-05-07 16:35:13

Si votre serveur est capable de fournir du contenu gzippé, avec Apache Http client 4.1, Tout ce dont vous avez besoin est d'utiliser

org.apache.http.impl.client.ContentEncodingHttpClient

, Qui est une sous-classe de DefaultHttpClient.

Ce client ajoutera également des en-têtes indiquant qu'il accepte le contenu gzippé.

17
répondu Denys 2011-08-04 12:49:04

Il n'a pas de support pour ce prêt à l'emploi, et il semble peu probable qu'il soit ajouté à HttpClient 3.x (voir le problème JIRA plutôt Garce ici). Vous pouvez cependant le faire en ajoutant des lecteurs de requêtes personnalisés et une gestion manuelle des flux de requêtes/réponses, superposés à la bibliothèque de base, mais c'est difficile.

Il semble que vous pouvez le faire avec HttpClient 4, mais pas sans effort.

Assez de mauvaise qualité, si vous me demandez, ce genre de choses devrait vraiment être plus facile qu'il ne l'est.

8
répondu skaffman 2010-05-05 21:59:35

Depuis 4.1, Apache HttpClients gère la compression des requêtes et des réponses.

  • Vous n'avez pas besoin de compresser la requête, Pas besoin de définir un "Accept-Encoding" dans les en-têtes de requête.
  • il gère automatiquement la décompression de réponse ainsi, pas besoin de gérer la décompression de réponse.
  • Jusqu'à 4.3 il gère gzip et dégonfler. Vous pouvez vérifier ResponseContentEncoding API doc ici .

Il suffit d'utiliser:

HttpClients.custom()

, Qui utilise:

HttpClientBuilder.create()

, Si vous voulez vérifier dans la bibliothèque goto HttpClientBuilder, il utilise RequestAcceptEncoding & ResponseContentEncoding

Vous pouvez le désactiver via "disableContentCompression ()"

HttpClient httpClient = HttpClients.custom()
                .setConnectionManager(cm)
                .disableContentCompression() //this disables compression
                .build();

Assurez-vous que si vous ajoutez un intercepteur, il peut remplacer cela, utilisez-le soigneusement.

HttpClient httpClient = HttpClients.custom()
                .setConnectionManager(cm)
                .setHttpProcessor(httpprocessor) //this interceptor can override your compression.
                .build();
2
répondu Garry 2018-05-16 10:50:46

Voici l'exemple de code scala qui utilise la bibliothèque java apache-http-client

 def createCloseableHttpClient(): CloseableHttpClient = {
    val builder: HttpClientBuilder = HttpClientBuilder.create
    val closableClient = builder.build()
    closableClient
  }

  def postData(data: String): Unit = {
    val entity = EntityBuilder.create()
      .setText(data)
      .setContentType(ContentType.TEXT_PLAIN)
      .gzipCompress()
      .build()
    val post = new HttpPost(postURL + endPoint)
    post.setEntity(entity)
    post.setHeader("Content-Type", "application/gzip")
    val client = createCloseableHttpClient()
    client.execute(post)
    client.close()
  }
1
répondu Knight71 2017-05-16 13:08:56
0
répondu James Selvakumar 2014-03-27 02:17:45

Il ne le supporte pas hors de la boîte mais vous pouvez transformer l'entité de HttpResponse retournée en une entité non compressée en appelant

val entity = new GzipDecompressingEntity(response.getEntity)

Ensuite, procédez avec entity.getContent comme toujours.

0
répondu expert 2016-05-14 20:56:40