Question

J'ai une communication HTTP à un serveur Web demandant des données JSON. Je voudrais compresser ce flux de données avec Content-Encoding: gzip. Est-il possible que je peux mettre Accept-Encoding: gzip dans mon HttpClient? La recherche de gzip dans les références Android ne montre pas tout ce qui concerne HTTP, comme vous pouvez le voir ici .

Était-ce utile?

La solution

Vous devez utiliser les en-têtes HTTP pour indiquer une connexion peut accepter des données codées gzip, par exemple:

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

Vérifier la réponse pour l'encodage de contenu:

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

Autres conseils

Si vous utilisez le niveau API 8 ou au-dessus il y a AndroidHttpClient .

Il a des méthodes d'aide comme:

public static InputStream getUngzippedContent (HttpEntity entity)

et

public static void modifyRequestToAcceptGzipResponse (HttpRequest request)

conduisant à un code beaucoup plus succincte:

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

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

Ils utilisent HttpRequestInterceptor et HttpResponseInterceptor

Exemple de requête:

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

        });

Je ne l'ai pas utilisé GZip, mais je suppose que vous devez utiliser le flux d'entrée de votre HttpURLConnection ou HttpResponse comme GZIPInputStream, et pas une autre classe spécifique.

Dans mon cas, il était comme ça:

URLConnection conn = ...;
InputStream instream = conn.getInputStream();
String encodingHeader = conn.getHeaderField("Content-Encoding");
if (encodingHeader != null && encodingHeader.toLowerCase().contains("gzip"))
{
    instream = new GZIPInputStream(instream);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top