Question

La bibliothèque Apache Commons HttpClient 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 aux fichiers de synchronisation avec le serveur).

Était-ce utile?

La solution

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

Autres conseils

Si votre serveur est en mesure de fournir du contenu au format gzip, avec le client Apache Http 4.1 tout ce que vous avez besoin est d'utiliser

org.apache.http.impl.client.ContentEncodingHttpClient

qui est une sous-classe de DefaultHttpClient.

Ce client va également ajouter des en-têtes en disant qu'il accepte le contenu au format gzip.

Il n'a pas de support pour cette hors-the-box, et il semble peu probable à ajouter à 3.x HttpClient (voir plutôt question garce de JIRA ici ). Vous pouvez toutefois le faire en ajoutant des lecteurs de demande de mesure et la manipulation demande manuelle / flux de réponse, en couches au-dessus de la bibliothèque de base, mais il est fiddly.

Il semble que vous pouvez le faire avec HttpClient 4, mais non sans un certain effort.

Jolie mauvaise qualité, si vous me demandez, ce genre de choses devrait vraiment être plus facile que.

Depuis 4.1, Apache gère HttpClients demande et à la compression de réponse.

  • Vous n'avez pas besoin de demander compress, pas besoin de définir une « Accept-Encoding » en-têtes de requête.
  • Il gère automatiquement la décompression de réponse aussi bien, pas besoin de gérer 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 utilisations:

HttpClientBuilder.create()

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

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

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

S'il vous plaît assurez-vous que si vous ajoutez des intercepteurs il peut passer outre que, l'utiliser avec précaution.

HttpClient httpClient = HttpClients.custom()
                .setConnectionManager(cm)
                .setHttpProcessor(httpprocessor) //this interceptor can override your compression.
                .build();

Voici le code échantillon 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()
  }

Protocole personnalisé Interceptor peut aider.

Disclaimer:. Je n'ai pas encore essayé

Il ne supporte pas de la boîte, mais vous pouvez transformer l'entité de HttpResponse retourné en un non compressé en appelant

val entity = new GzipDecompressingEntity(response.getEntity)

puis procéder à entity.getContent comme toujours.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top