8

我正在使用此示例中的代码将一个发送JSONObject到我的 Web 服务器。在这里重现代码Android client

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

int TIMEOUT_MILLISEC = 10000;  // = 10 seconds
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
HttpClient client = new DefaultHttpClient(httpParams);

HttpPost request = new HttpPost(serverUrl);
request.setEntity(new ByteArrayEntity(
    postMessage.toString().getBytes("UTF8")));
HttpResponse response = client.execute(request);

我的问题

如何JSONObject在将其发送到服务器之前进行最佳压缩以及如何在服务器上解压缩它(我正在使用Java Servlets)?

4

1 回答 1

14

根据这个http://android-developers.blogspot.com/2011/09/androids-http-clients.html如果你使用 Gingerbread 或更高版本 HttpURLConnection 会自动添加 gzip 压缩:

在 Gingerbread 中,我们添加了透明响应压缩。HttpURLConnection 会自动将此标头添加到传出请求中,并处理相应的响应:

接受编码:gzip

然后,您的网络服务器将需要处理 gzip 压缩。

编辑:
使用 Java Servlet 提供 Gzipped 内容

编辑 2:
使用 DefaultHttpClient 进行 Gzip 压缩 使用HttpClient 启用 GZip 压缩

private static final String HEADER_ACCEPT_ENCODING = "Accept-Encoding";
private static final String ENCODING_GZIP = "gzip";

final DefaultHttpClient client = new DefaultHttpClient(manager, parameters);

client.addRequestInterceptor(new HttpRequestInterceptor() {
  public void process(HttpRequest request, HttpContext context) {
    // Add header to accept gzip content
    if (!request.containsHeader(HEADER_ACCEPT_ENCODING)) {
      request.addHeader(HEADER_ACCEPT_ENCODING, ENCODING_GZIP);
    }
  }
});

client.addResponseInterceptor(new HttpResponseInterceptor() {
  public void process(HttpResponse response, HttpContext context) {
    // Inflate any responses compressed with gzip
    final HttpEntity entity = response.getEntity();
    final Header encoding = entity.getContentEncoding();
    if (encoding != null) {
      for (HeaderElement element : encoding.getElements()) {
        if (element.getName().equalsIgnoreCase(ENCODING_GZIP)) {
          response.setEntity(new InflatingEntity(response.getEntity()));
          break;
        }
      }
    }
  }
});

编辑 3:
这是另一个 Stackoverflow 问题,关于使用 Java 中的 HTTPClient 对帖子内容 GZip POST 请求进行gzip 压缩。您需要在发布数据之前手动压缩数据,因为正常的 http/gzip 操作是服务器将压缩后的内容发送到客户端。

于 2012-07-09T20:50:42.433 回答