用了两年的flutter,有了一些心得,不虚头巴脑,只求实战有用,以供学习或使用flutter的小伙伴参考,学习尚浅,如有不正确的地方还望各路大神指正,以免误人子弟,在此拜谢~(原创不易,转发请标注来源和作者)
注意:无特殊说明,flutter版本为3.0+
上篇文章我们对dio进行了封装,已经满足了基本使用,这一篇我们来对dio进行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协议可以减少服务器压力,同时可以使得我们的请求更快。
新建一个自己的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
Futurefetch(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();