本文介紹的步驟:在Flutter
中常見的網(wǎng)絡(luò)請(qǐng)求方式有三種:HttpClient
寒屯、http庫
荐捻、dio庫
一:httpClient
二:http
三:dio三方庫
一:httpClient
httpClient
是dart
自帶的請(qǐng)求類,在io包
中寡夹,實(shí)現(xiàn)了基本的網(wǎng)絡(luò)請(qǐng)求相關(guān)的操作处面。
// 一般需要導(dǎo)入這三個(gè)
import 'dart:convert'; // utf8.decoder
import 'dart:io'; // 用到 HttpClient請(qǐng)求?式 需要導(dǎo)入
import 'dart:async'; // 異步
getHttpClient() async {
var httpClient = new HttpClient();
var url = 'https://randomuser.me/api/?results=30';
var request = await httpClient.getUrl(Uri.parse(url));
var response = await request.close();
var jsonString = await response.transform(utf8.decoder).join();
// ignore: avoid_print
print('數(shù)據(jù):${jsonString}');
}
OK
,其實(shí)HttpClient
也可以發(fā)送post
相關(guān)的請(qǐng)求菩掏,我們這里就不再演練魂角。
HttpClient
雖然可以發(fā)送正常的網(wǎng)絡(luò)請(qǐng)求,但是會(huì)暴露過多的細(xì)節(jié):
比如需要主動(dòng)關(guān)閉request
請(qǐng)求智绸,拿到數(shù)據(jù)后也需要手動(dòng)的進(jìn)行字符串解碼
在開發(fā)中野揪,我們一般很多直接面向HttpClient
進(jìn)行網(wǎng)絡(luò)請(qǐng)求访忿,而是使用一些庫來完成。
二:http
http
是Dart
官方提供的另一個(gè)網(wǎng)絡(luò)請(qǐng)求類斯稳,相比于HttpClient
海铆,易用性提升了不少。
但是挣惰,沒有默認(rèn)集成到Dart
的SDK
中卧斟,所以我們需要先在pubspec
中依賴它:
http: ^0.12.0+2
//導(dǎo)入并且使用即可
import 'package:http/http.dart' as http;
void httpNetwork() async {
// 1.創(chuàng)建Client
final client = http.Client();
// 2.構(gòu)建uri
final url = Uri.parse("http://123.207.32.32:8000/api/v1/recommend");
// 3.發(fā)送請(qǐng)求
final response = await client.get(url);
// 4.獲取結(jié)果
if (response.statusCode == HttpStatus.ok) {
print(response.body);
} else {
print(response.statusCode);
}
}
三:dio三方庫
官方提供的HttpClient
和http
都可以正常的發(fā)送網(wǎng)絡(luò)請(qǐng)求,但是對(duì)于現(xiàn)代的應(yīng)用程序開發(fā)來說憎茂,我們通常要求的東西會(huì)更多:比如攔截器珍语、取消請(qǐng)求、文件上傳/下載竖幔、超時(shí)設(shè)置
等等板乙;
這個(gè)時(shí)候,我們可以使用一個(gè)在Flutter
中非常流行的三方庫:dio
拳氢;
dio
是一個(gè)強(qiáng)大的Dart Http
請(qǐng)求庫募逞,支持Restful API、FormData饿幅、攔截器凡辱、請(qǐng)求取消、Cookie管理栗恩、文件上傳/下載透乾、超時(shí)、自定義適配器
等...
使用dio
三方庫必然也需要先在pubspec
中依賴它:
dio: ^4.0.4
// 代碼演練:
import 'package:dio/dio.dart';
import 'dart:convert';
import 'dart:async';
void dioNetwork() async {
// 1.創(chuàng)建Dio請(qǐng)求對(duì)象
final dio = Dio();
// 2.發(fā)送網(wǎng)絡(luò)請(qǐng)求
final response = await dio.get("http://123.207.32.32:8000/api/v1/recommend");
// 3.打印請(qǐng)求結(jié)果
if (response.statusCode == HttpStatus.ok) {
print(response.data);
} else {
print("請(qǐng)求失斂某印:${response.statusCode}");
}
}
dio庫的封裝
1乳乌,實(shí)現(xiàn)封裝
import 'package:dio/dio.dart';
import 'dart:convert';
import 'dart:async';
/// dio網(wǎng)絡(luò)請(qǐng)求配置表 自定義
class DioConfig {
static const baseURL = 'http://117.34.71.31:8081/paas-admin'; //域名
static const timeout = 10000; //超時(shí)時(shí)間
}
// 網(wǎng)絡(luò)請(qǐng)求工具類
class DioRequest {
late Dio dio;
static DioRequest? _instance;
/// 構(gòu)造函數(shù)
DioRequest() {
dio = Dio();
dio.options = BaseOptions(
baseUrl: DioConfig.baseURL,
connectTimeout: DioConfig.timeout,
sendTimeout: DioConfig.timeout,
receiveTimeout: DioConfig.timeout,
contentType: 'application/json; charset=utf-8',
headers: {});
/// 請(qǐng)求攔截器 and 響應(yīng)攔截機(jī) and 錯(cuò)誤處理
dio.interceptors.add(InterceptorsWrapper(onRequest: (options, handler) {
print("\n================== 請(qǐng)求數(shù)據(jù) ==========================");
print("url = ${options.uri.toString()}");
print("headers = ${options.headers}");
print("params = ${options.data}");
return handler.next(options);
}, onResponse: (response, handler) {
print("\n================== 響應(yīng)數(shù)據(jù) ==========================");
print("code = ${response.statusCode}");
print("data = ${response.data}");
print("\n");
handler.next(response);
}, onError: (DioError e, handler) {
print("\n================== 錯(cuò)誤響應(yīng)數(shù)據(jù) ======================");
print("type = ${e.type}");
print("message = ${e.message}");
print("\n");
return handler.next(e);
}));
}
static DioRequest getInstance() {
return _instance ??= DioRequest();
}
}
2,統(tǒng)一請(qǐng)求服務(wù)
import 'dart:convert';
import 'dart:async';
import 'package:cyber_security/utils/http.dart';
class LoginService {
/// 獲取用戶數(shù)據(jù)中心列表
static Future<List> getDataCenter() async {
var response = await DioRequest.getInstance().dio.get('/getDataCenter');
var data = jsonDecode(response.toString());
return data['dataCenterList'];
}
/// 登錄接口
static login(value) async {
var response = await DioRequest.getInstance()
.dio
.post('/sys/login', queryParameters: value);
var data = jsonDecode(response.toString());
/// 對(duì)返回的身份憑證全局持久化存儲(chǔ)
return data['key'];
}
/// 獲取權(quán)限列表
static menuNav() async {
var response = await DioRequest.getInstance().dio.get('/sys/menu/nav');
var data = jsonDecode(response.toString());
return data['key'];
}
}
3市咆,發(fā)起請(qǐng)求
@override
void initState() {
// TODO: implement initState
super.initState();
/// 請(qǐng)求用戶數(shù)據(jù)中心數(shù)據(jù)
LoginService.getDataCenter().then((value) {
setState(() {
_dataCenterList = value;
});
});
}