Flutter Dio原始碼分析(一)--Dio介紹

Jimi發表於2021-08-30

文章系列

Flutter Dio原始碼分析(一)--Dio介紹

Flutter Dio原始碼分析(二)--HttpClient、Http、Dio對比

Flutter Dio原始碼分析(三)--深度剖析

Flutter Dio原始碼分析(四)--封裝

視訊系列

Flutter Dio原始碼分析(一)--Dio介紹視訊教程

Flutter Dio原始碼分析(二)--HttpClient、Http、Dio對比視訊教程

Flutter Dio原始碼分析(三)--深度剖析視訊教程

Flutter Dio原始碼分析(四)--封裝視訊教程

原始碼倉庫地址

github倉庫地址

前言

Flutter中網路請求有三種實現方式

  1. 系統自帶的HttpClient

  2. 網路請求第三方庫Http

  3. 網路請求第三方庫Dio

    Dio是目前比較流行的網路請求庫,裡面包含了很多如 Restful API攔截器自定義介面卡實現無縫切換其他網路庫 等操作。

目的

本文主要是對Dio網路請求庫進行原始碼分析,最後會對Dio封裝一個通用且使用方便的類。

本文中所用到的所有網路請求均為請求本地網路請求,目的是為了方便除錯,由SpringBoot驅動。

Dio介紹

dio是一個強大的Dart Http請求庫,支援Restful API、FormData、攔截器、請求取消、Cookie管理、檔案上傳/下載、超時、自定義介面卡等。

關鍵詞解釋

1、Restful API

1.1 API

API(Application Programming Interface,應用程式介面)是一些預先定義的函式,或指軟體系統不同組成部分銜接的約定。 目的是提供應用程式與開發人員基於某軟體或硬體得以訪問一組例程的能力,而又無需訪問原始碼,或理解內部工作機制的細節。

1.2 REST

REST即表述性狀態傳遞(英文:Representational State Transfer,簡稱REST)。簡單來說,就是用URI表示資源,用HTTP方法(GET, POST, PUT, DELETE)表徵對這些資源的操作。

2、FromData

Dio支援傳送 FormData, 請求資料將會以 multipart/form-data方式編碼, FormData中可以一個或多個包含檔案。主要目的用於檔案上傳操作。

注意: 只有 post 方法支援傳送 FormData.

3、攔截器

每個 Dio 例項都可以新增任意多個攔截器,他們組成一個佇列,攔截器佇列的執行順序是FIFO先進先出原則。通過攔截器你可以在請求之前、響應之後和發生異常時(但還沒有被 thencatchError處理)做一些統一的預處理操作。

4、請求取消

可以通過 cancel token 來取消發起的請求。

5、Cookie管理

CookieManager 攔截器可以幫助我們自動管理請求、響應 cookie。

6、檔案上傳/下載

Dio支援單檔案和多檔案的上傳

7、超時

Dio可設定超時時間,當在約定時間內未響應,將報錯。

8、自定義介面卡

內建的介面卡可無縫切換到別的請求庫而不用改之前的程式碼。

如何使用

步驟一:新增依賴

dependencies:
  dio: ^4.0.0 
複製程式碼

步驟二:傳送請求

import 'package:dio/dio.dart';
void _sendDioGet() async {
  try {
    var response = await Dio().get('http://localhost:8080/getUserInfo');
    print(response);
  } catch (e) {
    print(e);
  }
}
複製程式碼

完整示例程式碼

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';

class DioExample extends StatelessWidget {

  void _getUserInfo() async {
    try {
      var response = await Dio().get('http://localhost:8080/getUserInfo');
      print(response);
    } catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("DioExample"),
      ),
      body: Center(
        child: Column(
          children: [
            TextButton(
              onPressed: _getUserInfo,
              child: Text("傳送get請求"),
            )
          ],
        ),
      ),
    );
  }
}
複製程式碼

相關文章