我是靠谱客的博主 老实微笑,最近开发中收集的这篇文章主要介绍Http 请求和响应的gzip压缩,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

通过请求和响应头中增加

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);
    }


最后

以上就是老实微笑为你收集整理的Http 请求和响应的gzip压缩的全部内容,希望文章能够帮你解决Http 请求和响应的gzip压缩所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部