Frage

Ich habe eine HTTP -Kommunikation zu einem Webserver, der JSON -Daten anfordert. Ich hätte gerne diesen Datenstrom komprimieren Content-Encoding: gzip. Gibt es eine Möglichkeit, wie ich setzen kann? Accept-Encoding: gzip in meinem httpclient? Die Suche nach gzip In den Android -Referenzen wird nichts mit HTTP in Bezug auf HTTP angezeigt, wie Sie sehen können hier.

War es hilfreich?

Lösung

Sie sollten HTTP -Header verwenden, um anzuzeigen, dass eine Verbindung Gzip -codierte Daten akzeptieren kann, z. B.:

HttpUriRequest request = new HttpGet(url);
request.addHeader("Accept-Encoding", "gzip");
// ...
httpClient.execute(request);

Überprüfen Sie die Antwort auf die Inhaltscodierung:

InputStream instream = response.getEntity().getContent();
Header contentEncoding = response.getFirstHeader("Content-Encoding");
if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
    instream = new GZIPInputStream(instream);
}

Andere Tipps

Wenn Sie die API -Stufe 8 oder höher verwenden, gibt es Androidhttpclient.

Es hat Helfermethoden wie:

public static InputStream getUngzippedContent (HttpEntity entity)

und

public static void modifyRequestToAcceptGzipResponse (HttpRequest request)

was zu viel prägnanterer Code führt:

AndroidHttpClient.modifyRequestToAcceptGzipResponse( request );
HttpResponse response = client.execute( request );
InputStream inputStream = AndroidHttpClient.getUngzippedContent( response.getEntity() );

Ich denke, die Probe des Codes in diesem Link ist interessanter:ClientgzipContentCompression.java

Sie benutzen Httprequestinterceptor und HttPresponseInterceptor

Beispiel für Anfrage:

        httpclient.addRequestInterceptor(new HttpRequestInterceptor() {

            public void process(
                    final HttpRequest request,
                    final HttpContext context) throws HttpException, IOException {
                if (!request.containsHeader("Accept-Encoding")) {
                    request.addHeader("Accept-Encoding", "gzip");
                }
            }

        });

Beispiel für Antwort:

        httpclient.addResponseInterceptor(new HttpResponseInterceptor() {

            public void process(
                    final HttpResponse response,
                    final HttpContext context) throws HttpException, IOException {
                HttpEntity entity = response.getEntity();
                Header ceheader = entity.getContentEncoding();
                if (ceheader != null) {
                    HeaderElement[] codecs = ceheader.getElements();
                    for (int i = 0; i < codecs.length; i++) {
                        if (codecs[i].getName().equalsIgnoreCase("gzip")) {
                            response.setEntity(
                                    new GzipDecompressingEntity(response.getEntity()));
                            return;
                        }
                    }
                }
            }

        });

Ich habe GZIP nicht verwendet, aber ich würde annehmen, dass Sie den Eingabestream von Ihrem verwenden sollten HttpURLConnection oder HttpResponse wie GZIPInputStream, und nicht eine bestimmte andere Klasse.

In meinem Fall war es so:

URLConnection conn = ...;
InputStream instream = conn.getInputStream();
String encodingHeader = conn.getHeaderField("Content-Encoding");
if (encodingHeader != null && encodingHeader.toLowerCase().contains("gzip"))
{
    instream = new GZIPInputStream(instream);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top