Frage

Ist die Bibliothek Apache Commons Httpclient gzip unterstützen? Wir wollten gzip-Komprimierung auf unserem Apache-Server aktivieren verwenden, um den Client / Server-Kommunikation zu beschleunigen (wir haben eine PHP-Seite, die Synchronisierung von Dateien mit dem Server unsere Android-Anwendung erlaubt).

War es hilfreich?

Lösung

Apache Httpclient 4.1 unterstützt die Komprimierung von Inhalten aus der Box zusammen mit vielen anderen Funktionen, die vorher von Umfang wurden als aus.

Andere Tipps

Wenn Ihr Server in der Lage ist gzip-Inhalte, mit Apache HTTP-Client 4.1 alles, was Sie brauchen, ist die Verwendung

org.apache.http.impl.client.ContentEncodingHttpClient

, die eine Unterklasse von DefaultHttpClient ist.

Dieser Client wird auch Header hinzufügen, sagen, dass es gzipped Inhalt akzeptiert.

Es hat keine Unterstützung für diese Out-of-the-box, und es scheint unwahrscheinlich, dass Httpclient 3.x hinzugefügt werden (siehe eher zickig JIRA Ausgabe hier ). Sie können jedoch tun es von den Lesern individuelle Anfrage und manuelle Request / Response-Stream Handling, überlagert auf der Oberseite der Basis-Bibliothek hinzugefügt, aber es ist knifflig.

Es scheint, dass Sie es mit Httpclient 4 tun können, aber nicht ohne Anstrengung.

Pretty schlampige, wenn Sie mich fragen, dieses Zeug wirklich sollte einfacher sein, als es ist.

Seit 4.1, Apache HttpClients Griffe Anfrage- und Antwort Kompression.

  • Sie haben nicht zu komprimieren Anfrage benötigen, keine Notwendigkeit, um "Accept-Encoding" in-Request-Header.
  • Sie übernimmt automatisch Antwort Dekompression auch, keine Notwendigkeit Dekomprimierung Antwort zu behandeln.
  • Bis 4.3 behandelt es gzip und deflate. Sie können ResponseContentEncoding api doc hier .

Just Verwendung:

HttpClients.custom()

die Verwendungen:

HttpClientBuilder.create()

Wenn Sie in der Bibliothek goto HttpClientBuilder überprüfen möchten verwendet es RequestAcceptEncoding & ResponseContentEncoding

Sie können es durch deaktivieren "disableContentCompression ()"

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

Bitte stellen Sie sicher, wenn Sie irgendeine Interceptor hinzufügen, dass außer Kraft setzen können, verwenden Sie es sorgfältig.

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

Dies ist die Probe scala-Code, der verwendet Java Apache-HTTP-Client-Bibliothek

 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()
  }

benutzerdefinierte Protokoll Interceptor kann auch helfen.

Disclaimer:. Ich habe dies noch nicht ausprobiert

Es unterstützt es nicht aus der Box, aber Sie können Entität zurück HttpResponse in unkomprimierter eine Transformation durch den Aufruf

val entity = new GzipDecompressingEntity(response.getEntity)

dann weiter mit entity.getContent wie immer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top