Httpリクエストと応答のgzip圧縮
2527 ワード
リクエストとレスポンスヘッダで追加
Accept-Encoding: gzip
Content-Encodin:gzip
クライアントまたはサーバ側が圧縮をサポートしているかどうかを確認します.
例えば、クライアントは要求を送信し、サービス側は応答データを圧縮してクライアントに返す
1、クライアント要求にAccept-Encodingを追加する:gzipはクライアントがgzipをサポートすることを表す;
2、サービス側は要求を受信した後、結果をgzipで圧縮した後、クライアントに返し、応答ヘッダにContent-Encodinを追加する:gzipは応答データが圧縮されたことを示す
3、クライアントは要求を受け取り、応答ヘッドにContent-Encodin:gzipはデータの解凍処理が必要であることを示す
クライアントはまた、サービス側に圧縮データを送信し、コードによって要求データを圧縮すればよい.規範化のため、同様に要求にContent-Encodin:gzipを加える
OkHttp圧縮データ:
OkHttp解凍(自動応答gzip解凍):
BridgeInterceptorクラスブロック応答によりgzip解凍を自動処理
GZIPOutputStream、GZIPInputStreamによる圧縮と解凍:
Accept-Encoding: gzip
Content-Encodin:gzip
クライアントまたはサーバ側が圧縮をサポートしているかどうかを確認します.
例えば、クライアントは要求を送信し、サービス側は応答データを圧縮してクライアントに返す
1、クライアント要求にAccept-Encodingを追加する:gzipはクライアントがgzipをサポートすることを表す;
2、サービス側は要求を受信した後、結果をgzipで圧縮した後、クライアントに返し、応答ヘッダにContent-Encodinを追加する:gzipは応答データが圧縮されたことを示す
3、クライアントは要求を受け取り、応答ヘッドにContent-Encodin:gzipはデータの解凍処理が必要であることを示す
クライアントはまた、サービス側に圧縮データを送信し、コードによって要求データを圧縮すればよい.規範化のため、同様に要求にContent-Encodin:gzipを加える
OkHttp圧縮データ:
private RequestBody gzip(final RequestBody body) {
return new RequestBody() {
@Override
public MediaType contentType() {
return body.contentType();
}
@Override
public long contentLength() {
return -1; // We don't know the compressed length in advance!
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
BufferedSink gzipSink = Okio.buffer(new GzipSink(sink));
body.writeTo(gzipSink);
gzipSink.close();
}
};
}
public RequestBody getGzipRequest(String body) {
RequestBody request = null;
try {
request = RequestBody.create(MediaType.parse("application/octet-stream"),compress(body));
} catch (IOException e) {
e.printStackTrace();
}
return request;
}
OkHttp解凍(自動応答gzip解凍):
BridgeInterceptorクラスブロック応答によりgzip解凍を自動処理
GZIPOutputStream、GZIPInputStreamによる圧縮と解凍:
public static byte[] compress(String str) throws IOException {
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
try (GZIPOutputStream gzip = new GZIPOutputStream(out)) {
gzip.write(str.getBytes(StandardCharsets.UTF_8));
}
return out.toByteArray();
//return out.toString(StandardCharsets.ISO_8859_1);
// Some single byte encoding
}
}
public static String uncompress(byte[] str) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(str))) {
int b;
while ((b = gis.read()) != -1) {
baos.write((byte) b);
}
}
return new String(baos.toByteArray(), StandardCharsets.UTF_8);
}