Okhttp 3要求ネットワークオープンGzip圧縮


前言
まずOkHttp 3はGzip解凍をサポートしていますが、リクエストを開始したときに自動的にヘッダー、Accept-Encoding: gzipに加入することをサポートしており、サーバが戻ったときにヘッダーにContent-Encoding: gzipがあることを理解してください.もっと深い内容については、次の文章を参考にして、とてもよく話しています.HTTP gzip圧縮と一般的なAndroidネットワークフレームワークについて
では、サーバに大量のデータを提出する際にpostのデータをgzip圧縮したいのですが、どうすればいいのでしょうか.下に案を出します!
イニシアチブ
公式にはカスタムブロッキング方式が採用されています!ソースコード:okhttp/samples/guide/src/main/java/okhttp 3/recipes/RequestBodyCompression.javaくだらないことは言わないで、直接コードをつけます:
import java.io.IOException;

import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okio.BufferedSink;
import okio.GzipSink;
import okio.Okio;

public class GzipRequestInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request originalRequest = chain.request();
        if (originalRequest.body() == null || originalRequest.header("Content-Encoding") != null) {
            return chain.proceed(originalRequest);
        }

        Request compressedRequest = originalRequest.newBuilder()
                .header("Content-Encoding", "gzip")
                .method(originalRequest.method(), gzip(originalRequest.body()))
                .build();
        return chain.proceed(compressedRequest);
    }

    private RequestBody gzip(final RequestBody body) {
        return new RequestBody() {
            @Override
            public MediaType contentType() {
                return body.contentType();
            }

            @Override
            public long contentLength() {
                return -1; //               
            }

            @Override
            public void writeTo(BufferedSink sink) throws IOException {
                BufferedSink gzipSink = Okio.buffer(new GzipSink(sink));
                body.writeTo(gzipSink);
                gzipSink.close();
            }
        };
    }
}

次にOkhttpClientを構築するときに、ブロッキングを追加します.
OkHttpClient okHttpClient = new OkHttpClient.Builder() 
    .addInterceptor(new GzipRequestInterceptor())//  Gzip  
    ...
    .build();

後記
コンテンツ長content-lengthが必要な場合は、このissue:Here’s the full gzip interceptor with content length,to whom it may concernを参照してください.