文章系列
Flutter Dio原始碼分析(二)--HttpClient、Http、Dio對比
視訊系列
Flutter Dio原始碼分析(一)--Dio介紹視訊教程
Flutter Dio原始碼分析(二)--HttpClient、Http、Dio對比視訊教程
原始碼倉庫地址
前言
Flutter
中網路請求有三種實現方式
-
系統自帶的
HttpClient
-
網路請求第三方庫
Http
-
網路請求第三方庫
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
先進先出原則。通過攔截器你可以在請求之前、響應之後和發生異常時(但還沒有被 then
或 catchError
處理)做一些統一的預處理操作。
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請求"),
)
],
),
),
);
}
}
複製程式碼