Okhttp 3要求ネットワークオープンGzip圧縮
4023 ワード
前言
まずOkHttp 3はGzip解凍をサポートしていますが、リクエストを開始したときに自動的にヘッダー、
では、サーバに大量のデータを提出する際にpostのデータをgzip圧縮したいのですが、どうすればいいのでしょうか.下に案を出します!
イニシアチブ
公式にはカスタムブロッキング方式が採用されています!ソースコード:okhttp/samples/guide/src/main/java/okhttp 3/recipes/RequestBodyCompression.javaくだらないことは言わないで、直接コードをつけます:
次にOkhttpClientを構築するときに、ブロッキングを追加します.
後記
コンテンツ長content-lengthが必要な場合は、このissue:Here’s the full gzip interceptor with content length,to whom it may concernを参照してください.
まず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を参照してください.