Flutter 接口請求封裝,以及過濾攔截

對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????{};

??}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容