如何压缩 JSONObject 在 Android 中通过 Http 发送它?

Posted

技术标签:

【中文标题】如何压缩 JSONObject 在 Android 中通过 Http 发送它?【英文标题】:How to Compress a JSONObject send it over Http in Android? 【发布时间】:2012-07-09 07:25:54 【问题描述】:

我使用this example 中的代码从android client 向我的网络服务器发送JSONObject。此处重现代码

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)?

【问题讨论】:

数据量大到真的需要压缩吗? @Squonk 我可能需要做一些分析来量化我通过服务器发送的数据的大小,但是从客户端到服务器再返回大约需要 2 分 49 秒。 你看过developer.android.com/reference/java/util/zip/…吗?但是,您可能需要使用 HttpURLConnection 而不是 DefaultHttpClient 【参考方案1】:

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

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

接受编码:gzip

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

编辑:Serve Gzipped content with Java Servlets

编辑 2: Gzip 压缩使用 DefaultHttpClient Enabling GZip compression with HttpClient

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: 这是关于帖子内容的 gzip 压缩的另一个 *** 问题GZip POST request with HTTPClient in Java。您需要在发布数据之前手动压缩数据,因为正常的 http/gzip 操作是服务器将压缩后的内容发送到客户端。

【讨论】:

感谢您的回复。我正在使用 Android 2.2 和 DefaultHTTPClient 感谢 Edit2。这看起来像是从服务器接受 Gzip 响应的代码。在将数据发送到服务器之前,我正在查看 Android 客户端上的压缩。 我问了一个相关的问题***.com/questions/11414987/… “gzip”标头没有传输到服务器;我正在使用wireshark,我看不到“gzip”的痕迹...... 问题是关于从 Android 客户端到服务器的压缩,但这个答案是关于添加 Accept-Encoding 以启用从服务器到客户端的压缩。这没有回答问题——还是我错过了什么?

以上是关于如何压缩 JSONObject 在 Android 中通过 Http 发送它?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中将jsonstring转换为jsonobject?

ANDROID - 如何从 sqlite 字段中分离 JSONObject 值

android怎么遍历jsonobject

如何将 JsonObject 转换为类模型 kotlin android

Android JSONObject - 我如何遍历一个平面 JSON 对象来获取每个键和值

从android解析jsonObject并在webservice vb.net中获取它