• 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();

  • 相关阅读:
    【audio】alsa pcm音频路径
    Java Field.getType()方法具有什么功能呢?
    2022年全球市场刷脸支付系统总体规模、主要企业、主要地区、产品和应用细分研究报告
    Qt编写跨平台视频监控系统(64通道占用7%CPU/支持win_linux_mac等)
    KT142C语音芯片搭配HAA2018功放,两个板子,一个声音正常一个没有声音
    2022牛客暑期多校训练营7(BCFGJ)
    ICML 2017: 基于卷积的Seq2Seq解决方案
    【微软漏洞分析】MS10-015 Windows 内核异常处理程序漏洞(CVE-2010-0232)
    机器学习实验------线性回归方法
    毕业设计网站项目的开发流程
  • 原文地址:https://blog.csdn.net/hantian616/article/details/126118514