Flutter 一周前發(fā)布了1.9 版本泪掀,其中最大特性是將Flutter Web合入了主分支。而今天垦搬,Dio 也正式發(fā)布了3.0.0,該版本最大的特性是支持Flutter Web 和 Http/2.0。
升級提示:由于Dio 3.0需要支持Flutter Web百炬,需要對代碼進(jìn)行較大的重構(gòu),所以并不能完全向下兼容色迂,2.1版本用戶可參考 3.0升級指南 给猾。
支持Flutter Web
開發(fā)者只需要將Flutter升級到1.9或更新的dev版本,然后將Dio升級到最新的3.x即可支持Flutter Web即可方篮。
Http/2.0支持
Http/2.0 有鏈接復(fù)用羔砾、頭部壓縮申鱼、二進(jìn)制傳輸猴鲫、服務(wù)端推送等重多特性。Dio 3.0版本后,官方提供了一個 dio_http2_adapter 插件(HttpClientAdapter)來支持Http/2.0脑蠕。下面是官方示例:
import 'package:dio/dio.dart';
import 'package:dio_http2_adapter/dio_http2_adapter.dart';
main() async {
var dio = Dio()
..options.baseUrl = "https://google.com"
..interceptors.add(LogInterceptor())
..httpClientAdapter = Http2Adapter(
ConnectionManager(idleTimeout: 10000),
);
Response<String> response;
response = await dio.get("/?xx=6");
print(response.data);
}
可以看到只需要配置一下Http2Adapter即可跪削。值得注意的是Http2Adapter需要一個ConnectionManager參數(shù)迂求。ConnectionManager 主要職責(zé)是管理鏈接晃跺,是Http/2.0中鏈接復(fù)用策略的實(shí)現(xiàn)載體。官方提供了一個默認(rèn)的ConnectionManager 哼审,它的策略是同一個域名下的請求共享一個Socket鏈接孕豹,當(dāng)請求完成時,連接默認(rèn)繼續(xù)保持15秒励背,開發(fā)者可以通過idleTimeout來自定義保持時間。開發(fā)者提供自己的ConnectionManager來自定義鏈接復(fù)用策略址儒。
另外,Http2Adapter內(nèi)部已經(jīng)默認(rèn)處理了重定向莲趣,我們可以通過以下代碼驗(yàn)證:
response.redirects.forEach((e){
print("redirect: ${e.statusCode} ${e.location}");
});
輸出:
redirect: 301 https://www.google.com/?xx=6
redirect: 302 https://www.google.com.hk/url?sa=p&hl=zh-CN&pref=hkredirect&pval=yes&q=https://www.google.com.hk/%3Fxx%3D6&ust=1568810110125304&usg=AOvVaw0YbFhKFoslI0LPOPFcekGy
redirect: 302 https://www.google.com.hk/?xx=6
可以看到我們在大陸請求google時進(jìn)行了三次重定向饱溢!
其它更新
- FormData 支持嵌套。
- 刪除了
UploadFileInfo類绩郎,引入了MultipartFile
類;MultipartFile
類不僅支持通過文件來構(gòu)造上傳頭塊肋杖,也支持通過Stream、Byte數(shù)組状植、字符串來構(gòu)造。 - 將CookieManager抽離成了單獨(dú)的包津畸;這是因?yàn)樵贔lutter web中不需要手動管理Cookie(瀏覽器會自動管理),因此將其抽為單獨(dú)的插件按需引入會更合理吩案。
- 請求取消后,取消Error可以入隊(duì)攔截器隊(duì)列(2.1中取消的異常是直接拋給用戶處理)徘郭。
- 代碼優(yōu)化:API標(biāo)準(zhǔn)化靠益、語義化胧后;對核心代碼進(jìn)行了全部重構(gòu)。
詳情請參考:https://github.com/flutterchina/dio 壳快。