Android:HTTP通讯应该使用“Accept-Encoding:gzip”

我有一个HTTP通信到Web服务器请求JSON数据。 我想用Content-Encoding: gzip压缩这个数据stream。 有没有一种方法可以设置Accept-Encoding: gzip在我的HttpClient中? Android引用中的gzipsearch不会显示与HTTP相关的任何内容,如您在此处所看到的。

你应该使用http头来表示一个连接可以接受gzip编码的数据,例如:

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

检查内容编码的响应:

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

如果您使用的API级别为8或以上, 则为AndroidHttpClient 。

它有像下面这样的帮助方法:

 public static InputStream getUngzippedContent (HttpEntity entity) 

 public static void modifyRequestToAcceptGzipResponse (HttpRequest request) 

导致更简洁的代码:

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

我认为这个链接的代码示例更有趣: ClientGZipContentCompression.java

他们正在使用HttpRequestInterceptorHttpResponseInterceptor

请求示例:

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

回答样本:

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

我没有使用GZip,但我会假设你应该使用来自HttpURLConnectionHttpResponse的inputstream作为GZIPInputStream ,而不是一些特定的其他类。

在我的情况是这样的:

 URLConnection conn = ...; InputStream instream = conn.getInputStream(); String encodingHeader = conn.getHeaderField("Content-Encoding"); if (encodingHeader != null && encodingHeader.toLowerCase().contains("gzip")) { instream = new GZIPInputStream(instream); }