108 votes

Android : les communications HTTP doivent utiliser "Accept-Encoding : gzip".

J'ai une communication HTTP vers un serveur web demandant des données JSON. J'aimerais compresser ce flux de données avec Content-Encoding: gzip . Y a-t-il un moyen pour que je puisse régler Accept-Encoding: gzip dans mon HttpClient ? La recherche de gzip dans les références Android ne montre rien qui soit lié à HTTP, comme vous pouvez le voir aquí .

174voto

Bakhtiyor Points 2901

Vous devez utiliser les en-têtes http pour indiquer qu'une connexion peut accepter des données encodées par gzip, par ex :

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

Vérifier le codage du contenu de la réponse :

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

33voto

Volker Neumann Points 291

Si vous utilisez le niveau 8 de l'API ou un niveau supérieur, il y a AndroidHttpClient .

Il a des méthodes d'aide comme :

public static InputStream getUngzippedContent (HttpEntity entity)

y

public static void modifyRequestToAcceptGzipResponse (HttpRequest request)

ce qui conduit à un code beaucoup plus succinct :

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

13voto

Niqo Points 442

Je pense que l'échantillon de code sur ce lien est plus intéressant : ClientGZipContentCompression.java

Ils utilisent HttpRequestInterceptor y HttpResponseInterceptor

Echantillon sur demande :

        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");
                }
            }

        });

Exemple de réponse :

        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;
                        }
                    }
                }
            }

        });

1voto

Dimitar Dimitrov Points 6587

Je n'ai pas utilisé GZip, mais je suppose que vous devriez utiliser le flux d'entrée de votre fichier HttpURLConnection o HttpResponse como GZIPInputStream et non une autre classe spécifique.

0voto

Pedro Fraca Points 130

Voici une solution complète basée sur Android et Google App Engine. Gzip toute la communication json.

Regardez ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X