网站首页 > 文章精选 正文
用了两年的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<ResponseBody> fetch(RequestOptions options, Stream<Uint8List>? 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();
猜你喜欢
- 2025-06-10 第五天快http头部信息注入cooik(http 头部信息)
- 2025-06-10 HttpUrlConnection发送url请求(后台springmvc)
- 2025-06-10 你看过的动画片没有一个能逃过这10大定律,不信来试试
- 2025-06-10 如何给你的网站申请一个免费SSL,让HTTP变HTTPS
- 2025-06-10 前端常见面试 - 请求篇(前端面试经典问题)
- 2025-06-10 地球的关键瞬间(地球的k)
- 2025-06-10 09《Nginx 入门教程》Nginx 的 Http 模块介绍(下)
- 2025-06-10 使用Python并发执行HTTP请求(python并发处理)
- 2025-06-10 HTTP 响应状态码你知道多少?(http响应状态码的含义)
- 2025-06-10 Python3 新一代Http请求库Httpx使用(详情版)
- 最近发表
-
- 面试中常被问到的Hash表,你了解吗
- JAVA面试考点:一文搞懂一致性Hash的原理和实现
- 一次性搞清楚equals和hashCode(hashcode() 与equals()区别,简单说明)
- HashMap.Key的故事:Key为什么出现Hash碰撞及冲突呢?
- hash冲突的几种解决方案对比(hash冲突的解决方式)
- 游戏王LN 无头骑士(无头骑士cv)
- Linux ln、unlink命令用法(linux link命令详解)
- n和l分不清矫正发音方法,这三步就够了
- golang引用私有gitlab项目代码(golang引入当前包下的文件)
- Instamic:录音领域中的 GoPro,让你想录就录,随心所欲
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)