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圧縮データ:
    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);
    }