dio是flutter比較經常使用的網絡請求框架,下面是對dio簡單封裝,便於之後使用git
dependencies
dio: ^2.1.0
複製代碼
代碼說明詳見註釋github
import 'package:cookie_jar/cookie_jar.dart';
import 'package:dio/dio.dart';
import 'package:kuaixin/network/Api.dart';
var httpUtil = HttpUtil(
baseUrl:Api.baseUrl,
header:headers
);
var httpUtilJson = HttpUtil(
baseUrl:Api.baseUrl2,
header:headersJson
);
//普通格式的header
Map<String, dynamic> headers = {
"Accept":"application/json",
// "Content-Type":"application/x-www-form-urlencoded",
};
//json格式的header
Map<String, dynamic> headersJson = {
"Accept":"application/json",
"Content-Type":"application/json; charset=UTF-8",
};
class HttpUtil {
Dio dio;
BaseOptions options;
HttpUtil({String baseUrl= Api.baseUrl,Map<String, dynamic> header}) {
print('dio賦值');
// 或者經過傳遞一個 `options`來建立dio實例
options = BaseOptions(
// 請求基地址,通常爲域名,能夠包含路徑
baseUrl: baseUrl,
//鏈接服務器超時時間,單位是毫秒.
connectTimeout: 10000,
//[若是返回數據是json(content-type),dio默認會自動將數據轉爲json,無需再手動轉](https://github.com/flutterchina/dio/issues/30)
responseType:ResponseType.plain,
/// 響應流上先後兩次接受到數據的間隔,單位爲毫秒。若是兩次間隔超過[receiveTimeout],
/// [Dio] 將會拋出一個[DioErrorType.RECEIVE_TIMEOUT]的異常.
/// 注意: 這並非接收數據的總時限.
receiveTimeout: 3000,
headers: header,
);
dio = new Dio(options);
dio.interceptors.add(CookieManager(CookieJar()));
}
get(url, {data, options, cancelToken}) async {
print('get請求啓動! url:$url ,body: $data');
Response response;
try {
response = await dio.get(
url,
cancelToken: cancelToken,
);
print('get請求成功!response.data:${response.data}');
} on DioError catch (e) {
if (CancelToken.isCancel(e)) {
print('get請求取消! ' + e.message);
}
print('get請求發生錯誤:$e');
}
return response.data;
}
post(url, {data, options, cancelToken}) async {
print('post請求啓動! url:$url ,body: $data');
Response response;
try {
response = await dio.post(
url,
data: data,
);
print('post請求成功!response.data:${response.data}');
} on DioError catch (e) {
if (CancelToken.isCancel(e)) {
print('post請求取消! ' + e.message);
}
print('post請求發生錯誤:$e');
}
return response.data;
}
}
複製代碼
以前有個bug一直困擾我好久,獲取到的json數據key,value都不帶引號,致使解析失敗,又來加上responseType:ResponseType.plain
這句就ok了json
String url = Api.discover;
var jsonString = await httpUtil.get(url);
複製代碼
這裏jsonString即是一個json格式的數據了,還須要將其轉化爲實體類須要用到另外一個開源庫json_serializablebash