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

Flutter实战-请求封装(三)之http2_第1张图片

用了两年的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();

你可能感兴趣的:(flutter,flutter)