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 は、このヘッダーを発信リクエストに自動的に追加し、対応するレスポンスを処理します。

Accept-Encoding: gzip

その場合、Web サーバーは gzip 圧縮を処理する必要があります。

編集:
Gzip されたコンテンツを Java サーブレットで提供する

編集 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: Java で HTTPClient を使用した投稿コンテンツ GZip POST リクエスト
の gzip に関する別の Stackoverflow の質問があります。通常の http/gzip 操作は、gzip されたコンテンツをクライアントに送信するサーバーであるため、投稿する前にデータを手動で gzip する必要があります。

于 2012-07-09T20:50:42.433 に答える