Flutter 接口请求封装,以及过滤拦截

对flutter的网络请求做一个封装,包含token的获取和cookie的存储,以及一些异常状态的拦截过滤,代码如下:



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,

    );

  }

  ///发起网络请求

  ///[ url] 请求url

  ///[ params] 请求参数

  ///[ header] 外加头

  ///[ option] 配置

  static request(url, params, Map<String, String> header, Options option,

      {noTip = false}) async {

    //没有网络

    var connectivityResult = await (new Connectivity().checkConnectivity());

    if (connectivityResult == ConnectivityResult.none) {

      toastfn('网络异常,请重试!');

      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 {

        //授权码

        headers["Authorization"] = getAuthorization();

      }

    } else {

      //授权码

      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================== 请求数据 ==========================");

      print("url = ${options.uri.toString()}");

      print("headers = ${options.headers}");

      print("params = ${options.data}");

    }, onResponse: (Response response) {

      print("\n================== 响应数据 ==========================");

      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失效,调用native方法,退出登录

        logoutfn();

      } else if (response.data['code'] != 1) {

        toastfn(response.data['msg'] ?? '请求错误');

      }

      return response.data;

    }, onError: (DioError e) {

      print("\n================== 错误响应数据 ======================");

      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};

    }

  }

  ///清除授权

  static clearAuthorization() async {

    SpUtil.remove('token');

    SpUtil.remove('userInfo');

  }

  ///获取授权token

  static getAuthorization() {

    return SpUtil.getString('token');

  }

  ///获取请求头信息

  static getRequestHeader() {

    var _obj = SpUtil.getObject('requestHeader');

    return _obj ?? {};

  }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容