Est-ce que Apache Commons HttpClient __gVirt_NP_NN_NNPS<__ GZIP de soutien?
-
03-10-2019 - |
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).
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.