• Flutter实战-请求封装(三)之http2


    33a774f4d315ad77da9b0008fc309b5d.jpeg

    用了两年的flutter,有了一些心得,不虚头巴脑,只求实战有用,以供学习或使用flutter的小伙伴参考,学习尚浅,如有不正确的地方还望各路大神指正,以免误人子弟,在此拜谢~(原创不易,转发请标注来源和作者)

    注意:无特殊说明,flutter版本为3.0+

            上篇文章我们对dio进行了封装,已经满足了基本使用,这一篇我们来对dio进行http2改造,使得我们的请求加速。

    一.为什么要使用http2

    http2 既Http协议的2.0版本,那它和http1.0,http1.1有什么区别呢

    1.传输模型(Transimission Model)

    http 1.1: 

    pipeline ,串行请求,在面对大量并发用户时,容易造成堵塞,带宽和服务器性能要求加大

    http2:

    frame,采用二进制流,采用多资源并行,就是多路复用流,效率更高

    2.压缩(Compression)

    http 1.1:

    含有很多固定字段,比如Accept等,实际开发中我们将header中加入token中,通常token的信息含有较多,所以会比较长,占用了大量带宽

    http2:

    http2用hpack的方式对header也进行了压缩,尤其是当两次请求或应答时头部仅有部分差异时,只传输差异部分,这样就减少了带宽开销,客户端和服务器同时还维护一张头信息表,所有字段都会存入这个表,产生一个索引号,之后就不发送同样字段了,只需发送索引号

            以上是基本的内容,需要详细了解的可以去研究一下,综合来说使用http2协议可以减少服务器压力,同时可以使得我们的请求更快。

    二.dio 的http2 改造

    新建一个自己的Adapter,我们想实现的功能是,当处在正式环境调用https的时候开启http2。

    这里我们使用的是dio_http2_adapter,dio官方实现了http2的功能,有兴趣的可以点开看下源码

    dependencies: dio_http2_adapter: ^2.0.0

    看下自己的实现。

    class MyHttpAdapter extends HttpClientAdapter{

    Http2Adapter http2Adapter = Http2Adapter(
    ConnectionManager(
    idleTimeout: 60000,
    // Ignore bad certificate
    onClientCreate: (_, config) => config.onBadCertificate = (_) => true,
    ),
    );

    DefaultHttpClientAdapter defaultHttpClientAdapter = DefaultHttpClientAdapter()
    ..onHttpClientCreate = (HttpClient client) {
    client.idleTimeout = const Duration(seconds: 10);
    return null;
    };

    @override
    void close({bool force = false}) {
    // TODO: implement close
    http2Adapter.close();
    defaultHttpClientAdapter.close();
    }

    @override
    Future fetch(RequestOptions options, Stream? requestStream, Future? cancelFuture) {
    // TODO: implement fetch
    if(options.uri.toString().startsWith(RegExp(r'https'))){
    return http2Adapter.fetch(options, requestStream, cancelFuture);
    }else{
    return defaultHttpClientAdapter.fetch(options, requestStream, cancelFuture);
    }
    }

    }

    调用,将dio的httpClientAdapter 设置成我们自己的

    dio!.httpClientAdapter = MyHttpAdapter();

  • 相关阅读:
    # Java手写LRU缓存算法
    解决huggingface 在代码因为网络无法下载模型和数据集的问题(伪)
    p5.js 到底怎么设置背景图?
    IIFE立即执行函数表达式使用
    【LeetCode-二叉树训练】
    vue3 +ts 项目 实现富文本编辑 获取数据,数据回显
    datawhale8月组队学习《pandas数据处理与分析》(下)(文本、分类、时序数据)
    【AI大模型】驱动的未来:穿戴设备如何革新血液、皮肤检测与营养健康管理
    Flask数据库操作-Flask-SQLAlchemy
    junit单元测试
  • 原文地址:https://blog.csdn.net/hantian616/article/details/126118514