對flutter的網(wǎng)絡(luò)請求做一個封裝,包含token的獲取和cookie的存儲,以及一些異常狀態(tài)的攔截過濾,代碼如下:
import?'package:sp_util/sp_util.dart';
import?'package:connectivity/connectivity.dart';
import?'package:fluttertoast/fluttertoast.dart';
import?'package:dio/dio.dart';
import?'package:dio/adapter.dart';
import?'package:dio_cookie_manager/dio_cookie_manager.dart';
import?'package:cookie_jar/cookie_jar.dart';
import?'dart:collection';
import?'config.dart';
///http請求管理類,可單獨抽取出來
class?HttpRequest?{
??static?const?CONTENT_TYPE_JSON?=?"application/json;charset=utf-8";
??static?const?CONTENT_TYPE_FORM?=?"application/x-www-form-urlencoded";
??static?Map?optionParams?=?{
????"timeoutMs":?15000,
????"token":?null,
??};
??static?Map?urlobj;
??static?String?_baseUrl?=?Config.baseUrl;
??static?get(url,?{param,?Map<String,?String>?header={}})?async?{
????Map<String,?String>?headers?=?new?HashMap();
? ? headers.addAll(header);
????return?await?request(
????????_url?+?url,?param,?headers,?new?Options(method:?"GET"));
??}
??static?post(url,?param,?{Map<String,?String>?header ={}})?async?{
????Map<String,?String>?headers?=?new?HashMap();
? ? headers.addAll(header);
? ? return?await?request(
????????_url?+?url,
????????param,
????????{"Accept":?CONTENT_TYPE_JSON,?...headers},
????????new?Options(method:?'POST'));
??}
? static?toastfn(msg)?{
????Fluttertoast.showToast(
??????msg:?msg,
??????toastLength:?Toast.LENGTH_SHORT,
??????gravity:?ToastGravity.CENTER,
??????timeInSecForIosWeb:?1,
??????fontSize:?16.0,
????);
??}
??///發(fā)起網(wǎng)絡(luò)請求
??///[?url]?請求url
??///[?params]?請求參數(shù)
??///[?header]?外加頭
??///[?option]?配置
??static?request(url,?params,?Map<String,?String>?header,?Options?option,
??????{noTip?=?false})?async?{
????//沒有網(wǎng)絡(luò)
????var?connectivityResult?=?await?(new?Connectivity().checkConnectivity());
????if?(connectivityResult?==?ConnectivityResult.none)?{
??????toastfn('網(wǎng)絡(luò)異常,請重試!');
??????Response?errorResponse;
??????errorResponse?=?new?Response(statusCode:?444);
??????return?{'code':?444,?'data':?null,?'error':?errorResponse};
????}
????Map<String,?String>?headers?=?new?HashMap();
????if?(header?!=?null)?{
??????headers.addAll(header);
??????if?(header['noToken']?==?'1')?{
????????headers['Authorization']?=?headers['noToken']?=?'';
??????}?else?{
????????//授權(quán)碼
????????headers["Authorization"]?=?getAuthorization();
??????}
????}?else?{
??????//授權(quán)碼
??????headers["Authorization"]?=?getAuthorization();
????}
? ? if?(option?==?null)?{
??????option?=?new?Options(method:?"get");
????}
????option.headers?=?headers;
????Dio?dio?=?new?Dio();
????///超時
????dio.options.connectTimeout?=?30000;
????var?cookieJar?=?CookieJar();
????dio.interceptors.add(CookieManager(cookieJar));
????//?強行信任
????if?(_baseUrl.indexOf('https')?!=?-1)?{
??????(dio.httpClientAdapter?as?DefaultHttpClientAdapter).onHttpClientCreate?=
??????????(client)?{
????????client.badCertificateCallback?=?(cert,?host,?port)?{
??????????return?true;
????????};
??????};
????}
????//?添加攔截器
????dio.interceptors
????????.add(InterceptorsWrapper(onRequest:?(RequestOptions?options)?{
? ? ? print("\n==================?請求數(shù)據(jù)?==========================");
? ? ? print("url?=?${options.uri.toString()}");
? ? ? print("headers?=?${options.headers}");
? ? ? print("params?=?${options.data}");
????},?onResponse:?(Response?response)?{
??????print("\n==================?響應(yīng)數(shù)據(jù)?==========================");
??????print("code?=?${response.statusCode}");
??????print("url?=?$url");
??????print("headers?=?$headers");
??????print("params?=?$params");
??????print("data?=?${response.data}");
??????if?([401,?402,?405].contains(response.data['code']))?{
????????//token失效,調(diào)用native方法,退出登錄
????????logoutfn();
??????} else?if?(response.data['code']?!=?1)?{
????????toastfn(response.data['msg']????'請求錯誤');
??????}
??????return?response.data;
????},?onError:?(DioError?e)?{
??????print("\n==================?錯誤響應(yīng)數(shù)據(jù)?======================");
??????print("url?=?$url");
??????print("headers?=?$headers");
??????print("params?=?$params");
??????print("type?=?${e.type}");
??????print("message?=?${e.message}");
??????print("stackTrace?=?${e.toString()}");
??????if?([
????????'Http?status?error?[401]',
????????'Http?status?error?[402]',
????????'Http?status?error?[405]'
??????].contains(e.message))?{
????????//token失效,清緩存,退出
????????logoutfn();
??????}?else?{
????????toastfn(e.message????'未知錯誤');
??????}
????}));
????Response?response;
????try?{
??????response?=?await?dio.request(url,?data:?params,?options:?option);
??????return?response.data;
????}?on?DioError?catch?(e)?{
??????//?請求錯誤處理
??????Response?errorResponse;
??????if?(e.response?!=?null)?{
????????errorResponse?=?e.response;
??????}?else?{
????????errorResponse?=?new?Response(statusCode:?666,?data:?null);
??????}
??????return?{'code':?666,?'data':?null,?'error':?errorResponse};
????}
??}
??///清除授權(quán)
??static?clearAuthorization()?async?{
????SpUtil.remove('token');
????SpUtil.remove('userInfo');
??}
??///獲取授權(quán)token
??static?getAuthorization()?{
????return?SpUtil.getString('token');
??}
??///獲取請求頭信息
??static?getRequestHeader()?{
????var?_obj?=?SpUtil.getObject('requestHeader');
????return?_obj????{};
??}
}