flutter dio网络请求共用包

/**
 * create by wanghao
 *  2019/8/7 18:47
 **/

import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:flustars/flustars.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'dart:convert' as convert;

class HttpGo {
  static final String GET = "get";
  static final String POST = "post";
  static final String DATA = "data";
  static final String CODE = "code";
  static final String MSG = "msg";

  Dio dio;
  static HttpGo _instance;

  static HttpGo getInstance() {
    if (_instance == null) {
      _instance = HttpGo();
    }
    return _instance;
  }

  HttpGo() {
    dio = Dio(Options(
      /*baseUrl: "http://192.168.5.6:8085",*/
      headers: {
        'content-type': 'application/json',//
        'Authorization': SpUtil.getString("token")},//没有的话请注释掉
      connectTimeout: 5000,
      receiveTimeout: 100000,
      responseType: ResponseType.JSON,
    ));
  }

  //get请求
  get(String url, Function successCallBack,
      {params, Function errorCallBack}) async {
    _requstHttp(url, successCallBack, GET, params, errorCallBack);
  }

  //post请求
  post(String url, Function successCallBack, FormData formData,
      Function errorCallBack) async {
    _requstHttp(url, successCallBack, POST, formData, errorCallBack);
  }

  //post请求
  post1(String url, Function successCallBack, Map<String,dynamic> formData,
      Function errorCallBack) async {
    _requstHttp1(url, successCallBack, POST, formData, errorCallBack);
  }

  _requstHttp(String url, Function successCallBack,
      [String method, FormData params, Function errorCallBack]) async {
    String errorMsg = '';
    int code;

    try {
      Response response;
      _addStartHttpInterceptor(dio); //添加请求之前的拦截器
      if (method == GET) {
        if (params != null && params.isNotEmpty) {
          response = await dio.get(url, data: params);
        } else {
          response = await dio.get(url);
        }
      } else if (method == POST) {
        if (params != null && params.isNotEmpty) {
          response = await dio.post(url, data: params);
        } else {
          response = await dio.post(url);
        }
      }

      code = response.statusCode;
      if (code != 200) {
        errorMsg = '错误码:' + code.toString() + ',' + response.data.toString();
        _error(errorCallBack, errorMsg);
        return;
      }

      String dataStr = json.encode(response.data);
      Map<String, dynamic> dataMap = json.decode(dataStr);
      if (dataMap != null && dataMap[CODE] != 0) {
        errorMsg =
            '错误码:' + dataMap[CODE].toString() + ',' + dataMap[MSG].toString();
        _error(errorCallBack, errorMsg);
        return;
      }

      if (successCallBack != null) {
        successCallBack(dataMap[DATA]);
      }
    } catch (exception) {
      _error(errorCallBack, exception.toString());
    }
  }

  _requstHttp1(String url, Function successCallBack,
      [String method, Map<String,dynamic> params, Function errorCallBack]) async {
    String errorMsg = '';
    int code;

    try {
      Response response;
      _addStartHttpInterceptor(dio); //添加请求之前的拦截器
      if (method == GET) {
        if (params != null && params.isNotEmpty) {
          response = await dio.get(url, data: params);
        } else {
          response = await dio.get(url);
        }
      } else if (method == POST) {
        if (params != null && params.isNotEmpty) {
          response = await dio.post(url, data: params);
        } else {
          response = await dio.post(url);
        }
      }

      code = response.statusCode;
      if (code != 200) {
        errorMsg = '错误码:' + code.toString() + ',' + response.data.toString();
        _error(errorCallBack, errorMsg);
        return;
      }

      String dataStr = json.encode(response.data);
      print("here is result" + dataStr);
      Map<String, dynamic> dataMap = json.decode(dataStr);
      if (dataMap != null && dataMap[CODE] != 0) {
        if(dataMap[CODE] != 11) {
          errorMsg =
              '错误码:' + dataMap[CODE].toString() + ',' + dataMap[MSG].toString();
        } else {
          errorMsg = dataMap[MSG].toString();
        }
        _error(errorCallBack, errorMsg);
        return;
      }

      if (successCallBack != null) {
        successCallBack(dataMap[DATA]);
      }
    } catch (exception) {
      _error(errorCallBack, exception.toString());
    }
  }

  _error(Function errorCallBack, String error) {
    Fluttertoast.showToast(
        msg: error.toString(),
        toastLength: Toast.LENGTH_SHORT,
        gravity: ToastGravity.CENTER);
    if (errorCallBack != null) {
      errorCallBack(error);
    }
  }

  _addStartHttpInterceptor(Dio dio) {
    dio.interceptor.request.onSend = (Options options) {
      // 在请求被发送之前做一些事情   比如加密的一些操作 或者添加token等参数 对head 或者请求参数进行加工处理
      Map<String, dynamic> headers = options.headers;
      Map<String, dynamic> body = options.data;
      /*request['token'] = '1111111111';
      headers['addParam'] = 'aaaaaaaaaaaaaaa';*/
      return options;
    };
  }
}

 使用方法:

 HttpGo.getInstance().post1(
        Constants.login_url,
            (result) {
          String data = result.toString();
          print("AAAAA" + data);
          // bean = UserInfoBean.fromJson(result);
          Anim.goNextReplace(context, BasePage());
        },
        Tool.getParams1(dataStr),
            (error) {
          print("error:===>" + error);
          Tool.showToastShort(error.toString());

        });

其中的dataStr 是请求的字段:

var data = {"pageSize":100,"pageIndex":_page};
String dataStr = convert.jsonEncode(data);

其中post1和post的区别主要是请求字段数据类型的区别一个是

Map<String,dynamic>

另一个是

FormData

主要看服务器那边要求是那种,另外服务器返回的数据在HttpGo中已经将最外层解析了,所以post或post1方法里返回的result是data字段里的数据而且数据类型是

Map<String, dynamic>

的而不是String类型的,如果是集合的话是一个Map集合可以放到list里面解析如下:

 List responseJson = result;
          List<CollectItemBean> list = responseJson.map((m) => CollectItemBean.fromJson(m)).toList();
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值