Dio 3.0發(fā)布,支持Flutter Web 和 Http/2.0

Flutter 一周前發(fā)布了1.9 版本,其中最大特性是將Flutter Web合入了主分支。而今天,Dio 也正式發(fā)布了3.0.0,該版本最大的特性是支持Flutter Web 和 Http/2.0。

升級(jí)提示:由于Dio 3.0需要支持Flutter Web,需要對(duì)代碼進(jìn)行較大的重構(gòu),所以并不能完全向下兼容,2.1版本用戶可參考 3.0升級(jí)指南

支持Flutter Web

開(kāi)發(fā)者只需要將Flutter升級(jí)到1.9或更新的dev版本,然后將Dio升級(jí)到最新的3.x即可支持Flutter Web即可。

Http/2.0支持

Http/2.0 有鏈接復(fù)用、頭部壓縮、二進(jìn)制傳輸、服務(wù)端推送等重多特性。Dio 3.0版本后,官方提供了一個(gè) dio_http2_adapter 插件(HttpClientAdapter)來(lái)支持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需要一個(gè)ConnectionManager參數(shù)。ConnectionManager 主要職責(zé)是管理鏈接,是Http/2.0中鏈接復(fù)用策略的實(shí)現(xiàn)載體。官方提供了一個(gè)默認(rèn)的ConnectionManager ,它的策略是同一個(gè)域名下的請(qǐng)求共享一個(gè)Socket鏈接,當(dāng)請(qǐng)求完成時(shí),連接默認(rèn)繼續(xù)保持15秒,開(kāi)發(fā)者可以通過(guò)idleTimeout來(lái)自定義保持時(shí)間。開(kāi)發(fā)者提供自己的ConnectionManager來(lái)自定義鏈接復(fù)用策略。

另外,Http2Adapter內(nèi)部已經(jīng)默認(rèn)處理了重定向,我們可以通過(guò)以下代碼驗(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

可以看到我們?cè)诖箨懻?qǐng)求google時(shí)進(jìn)行了三次重定向!

其它更新

  • FormData 支持嵌套。
  • 刪除了UploadFileInfo類,引入了MultipartFile類;MultipartFile類不僅支持通過(guò)文件來(lái)構(gòu)造上傳頭塊,也支持通過(guò)Stream、Byte數(shù)組、字符串來(lái)構(gòu)造。
  • 將CookieManager抽離成了單獨(dú)的包;這是因?yàn)樵贔lutter web中不需要手動(dòng)管理Cookie(瀏覽器會(huì)自動(dòng)管理),因此將其抽為單獨(dú)的插件按需引入會(huì)更合理。
  • 請(qǐng)求取消后,取消Error可以入隊(duì)攔截器隊(duì)列(2.1中取消的異常是直接拋給用戶處理)。
  • 代碼優(yōu)化:API標(biāo)準(zhǔn)化、語(yǔ)義化;對(duì)核心代碼進(jìn)行了全部重構(gòu)。

詳情請(qǐng)參考:https://github.com/flutterchina/dio

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容