Dio 3.0釋出,支援Flutter Web 和 Http/2.0

wendux發表於2019-09-18

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…

相關文章