Flutter 一週前釋出了1.9 版本,其中最大特性是將Flutter Web合入了主分支。而今天,Dio 也正式釋出了3.0.0,該版本最大的特性是支援Flutter Web 和 Http/2.0。
升級提示:由於Dio 3.0需要支援Flutter Web,需要對程式碼進行較大的重構,所以並不能完全向下相容,2.1版本使用者可參考 3.0升級指南 。
支援Flutter Web
開發者只需要將Flutter升級到1.9或更新的dev版本,然後將Dio升級到最新的3.x即可支援Flutter Web即可。
Http/2.0支援
Http/2.0 有連結複用、頭部壓縮、二進位制傳輸、服務端推送等重多特性。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引數。ConnectionManager 主要職責是管理連結,是Http/2.0中連結複用策略的實現載體。官方提供了一個預設的ConnectionManager ,它的策略是同一個域名下的請求共享一個Socket連結,當請求完成時,連線預設繼續保持15秒,開發者可以通過idleTimeout來自定義保持時間。開發者提供自己的ConnectionManager來自定義連結複用策略。
另外,Http2Adapter內部已經預設處理了重定向,我們可以通過以下程式碼驗證:
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時進行了三次重定向!
其它更新
- FormData 支援巢狀。
- 刪除了
UploadFileInfo類,引入了MultipartFile
類;MultipartFile
類不僅支援通過檔案來構造上傳頭塊,也支援通過Stream、Byte陣列、字串來構造。 - 將CookieManager抽離成了單獨的包;這是因為在Flutter web中不需要手動管理Cookie(瀏覽器會自動管理),因此將其抽為單獨的外掛按需引入會更合理。
- 請求取消後,取消Error可以入隊攔截器佇列(2.1中取消的異常是直接拋給使用者處理)。
- 程式碼優化:API標準化、語義化;對核心程式碼進行了全部重構。
詳情請參考:github.com/flutterchin… 。