# 網絡操作
## Dio http庫
通過上一節介紹,我們可以發現直接使用HttpClient發起網絡請求是比較麻煩的,很多事情得我們手動處理,如果再涉及到文件上傳/下載、Cookie管理等就會非常繁瑣。幸運的是,Dart社區有一些第三方http請求庫,用它們來發起http請求將會簡單的多,本節我們介紹一下目前人氣較高的[dio](https://github.com/flutterchina/dio)庫。
> dio是一個強大的Dart Http請求庫,支持Restful API、FormData、攔截器、請求取消、Cookie管理、文件上傳/下載、超時等。
### 引入
引入dio:
```
dependencies:
dio: ^x.x.x #請使用pub上的最新版本
```
導入并創建dio實例:
```
import 'package:dio/dio.dart';
Dio dio = new Dio();
```
接下來就可以通過 dio實例來發起網絡請求了,注意,一個dio實例可以發起多個http請求,一般來說,APP只有一個http數據源時,dio應該使用單例模式。
### 示例
發起 `GET` 請求 :
```
Response response;
response=await dio.get("/test?id=12&name=wendu")
print(response.data.toString());
```
對于`GET`請求我們可以將query參數通過對象來傳遞,上面的代碼等同于:
```
response=await dio.get("/test",queryParameters:{"id":12,"name":"wendu"})
print(response);
```
發起一個 `POST` 請求:
```
response=await dio.post("/test",data:{"id":12,"name":"wendu"})
```
發起多個并發請求:
```
response= await Future.wait([dio.post("/info"),dio.get("/token")]);
```
下載文件:
```
response=await dio.download("https://www.google.com/",_savePath);
```
發送 FormData:
```
FormData formData = new FormData.from({
"name": "wendux",
"age": 25,
});
response = await dio.post("/info", data: formData)
```
如果發送的數據是FormData,則dio會將請求header的`contentType`設為“multipart/form-data”。
通過FormData上傳多個文件:
```
FormData formData = new FormData.from({
"name": "wendux",
"age": 25,
"file1": new UploadFileInfo(new File("./upload.txt"), "upload1.txt"),
"file2": new UploadFileInfo(new File("./upload.txt"), "upload2.txt"),
// 支持文件數組上傳
"files": [
new UploadFileInfo(new File("./example/upload.txt"), "upload.txt"),
new UploadFileInfo(new File("./example/upload.txt"), "upload.txt")
]
});
response = await dio.post("/info", data: formData)
```
值得一提的是,dio內部仍然使用HttpClient發起的請求,所以代理、請求認證、證書校驗等和HttpClient是相同的,我們可以在`onHttpClientCreate`回調中設置,例如:
```
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) {
//設置代理
client.findProxy = (uri) {
return "PROXY 192.168.1.2:8888";
};
//校驗證書
httpClient.badCertificateCallback=(X509Certificate cert, String host, int port){
if(cert.pem==PEM){
return true; //證書一致,則允許發送數據
}
return false;
};
};
```
注意,`onHttpClientCreate`會在當前dio實例內部需要創建HttpClient時調用,所以通過此回調配置HttpClient會對整個dio實例生效,如果你想針對某個應用請求單獨的代理或證書校驗策略,可以創建一個新的dio實例即可。
怎么樣,是不是很簡單,除了這些基本的用法,dio還支持請求配置、攔截器等,官方資料比較詳細,故本書不再贅述,詳情可以參考dio主頁:<https://github.com/flutterchina/dio> 。 下一節我們將使用dio實現一個分塊下載器。
- 緣起
- 起步
- 移動開發技術簡介
- Flutter簡介
- 搭建Flutter開發環境
- 常見配置問題
- Dart語言簡介
- 第一個Flutter應用
- 計數器示例
- 路由管理
- 包管理
- 資源管理
- 調試Flutter APP
- Dart線程模型及異常捕獲
- 基礎Widgets
- Widget簡介
- 文本、字體樣式
- 按鈕
- 圖片和Icon
- 單選框和復選框
- 輸入框和表單
- 布局類Widgets
- 布局類Widgets簡介
- 線性布局Row、Column
- 彈性布局Flex
- 流式布局Wrap、Flow
- 層疊布局Stack、Positioned
- 容器類Widgets
- Padding
- 布局限制類容器ConstrainedBox、SizeBox
- 裝飾容器DecoratedBox
- 變換Transform
- Container容器
- Scaffold、TabBar、底部導航
- 可滾動Widgets
- 可滾動Widgets簡介
- SingleChildScrollView
- ListView
- GridView
- CustomScrollView
- 滾動監聽及控制ScrollController
- 功能型Widgets
- 導航返回攔截-WillPopScope
- 數據共享-InheritedWidget
- 主題-Theme
- 事件處理與通知
- 原始指針事件處理
- 手勢識別
- 全局事件總線
- 通知Notification
- 動畫
- Flutter動畫簡介
- 動畫結構
- 自定義路由過渡動畫
- Hero動畫
- 交錯動畫
- 自定義Widget
- 自定義Widget方法簡介
- 通過組合現有Widget實現
- 實例:TurnBox
- CustomPaint與Canvas
- 實例:圓形漸變進度條(自繪)
- 文件操作與網絡請求
- 文件操作
- Http請求-HttpClient
- Http請求-Dio package
- 實例:Http分塊下載
- WebSocket
- 使用Socket API
- Json轉Model
- 包與插件
- 開發package
- 插件開發:平臺通道簡介
- 插件開發:實現Android端API
- 插件開發:實現IOS端API
- 系統能力調用
- 國際化
- 讓App支持多語言
- 實現Localizations
- 使用Intl包
- Flutter核心原理
- Flutter UI系統
- Element和BuildContext
- RenderObject與RenderBox
- Flutter從啟動到顯示