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).
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.
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é.
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.
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();
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()
}
Les intercepteurs de protocole personnalisés {[2] } peuvent également aider.
Avertissement: je n'ai pas encore essayé.
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.