flutter 封装请求

2020-06-15  本文已影响0人  泛滥的小愤青

拦截器+头部配置token

import 'dart:io';

import 'package:cookie_jar/cookie_jar.dart';
import 'package:dio/dio.dart';

// 使用单例模式(只被实例化一次)
class HttpUtil {
  static HttpUtil instance;
  Dio dio;
  BaseOptions options;

  CancelToken cancelToken = new CancelToken();

  //判断是否重新实例
  static HttpUtil getInstance() {
    if (null == instance) instance = new HttpUtil();
    return instance;
  }

  /*
   * 构造函数(初始化配置)
   */
  HttpUtil() {
    //BaseOptions、Options、RequestOptions 都可以配置参数,优先级别依次递增,且可以根据优先级别覆盖参数
    options = new BaseOptions(
      //请求基地址,可以包含子路径
      baseUrl: "http://www.google.com",
      //连接服务器超时时间,单位是毫秒.
      connectTimeout: 10000,
      //响应流上前后两次接受到数据的间隔,单位为毫秒。
      receiveTimeout: 5000,
      //Http请求头.
      headers: {
        //do something
        "version": "1.0.0",
        'Accept':'application/json, text/plain, */*',
        'Content-Type':'application/json',
         "version": "1.0.0"
      },
      //请求的Content-Type,默认值是[ContentType.json]. 也可以用ContentType.parse("application/x-www-form-urlencoded")
      contentType: ContentType.json,
      //表示期望以那种格式(方式)接受响应数据。接受4种类型 `json`, `stream`, `plain`, `bytes`. 默认值是 `json`,
      responseType: ResponseType.json,
    );


    dio = new Dio(options);

    //Cookie管理
    // dio.interceptors.add(CookieManager(CookieJar()));

    //拦截器
    dio.interceptors.add(InterceptorsWrapper(onRequest: (RequestOptions options) {
      SharedPreferences prefs = await SharedPreferences.getInstance();
      var token =  prefs.get("token");
      options.headers.addAll({"Authorization":"Bearer $token"});//此处在请求前配置了存储在SharedPreferences里面的token,没需要可以不加
      print("开始请求");
      // Do something before request is sent
      return options; //continue
    }, onResponse: (Response response) {
      print("成功之前");
      // Do something with response data
      return response; // continue
    }, onError: (DioError e) {
      print("错误之前");
      // Do something with response error
      return e; //continue
    }));
  }

  /*
   * get请求
   */
  get(url, {data, options, cancelToken}) async {
    Response response;
    try {
      response = await dio.get(url, queryParameters: data, options: options, cancelToken: cancelToken);
      print('get success---------${response.statusCode}');
      print('get success---------${response.data}');

//      response.data; 响应体
//      response.headers; 响应头
//      response.request; 请求体
//      response.statusCode; 状态码

    } on DioError catch (e) {
      print('get error---------$e');
      formatError(e);
    }
    return response.data;
  }

  /*
   * post请求
   */
  post(url, {data, options, cancelToken}) async {
    Response response;
    try {
      response = await dio.post(url, queryParameters: data, options: options, cancelToken: cancelToken);
      print('post success---------${response.data}');
    } on DioError catch (e) {
      print('post error---------$e');
      formatError(e);
    }
    return response.data;
  }




  /*
   * error统一处理
   */
  void formatError(DioError e) {
    if (e.type == DioErrorType.CONNECT_TIMEOUT) {
     
      print("连接超时");
    } else if (e.type == DioErrorType.SEND_TIMEOUT) {
   
      print("请求超时");
    } else if (e.type == DioErrorType.RECEIVE_TIMEOUT) {
     
      print("响应超时");
    } else if (e.type == DioErrorType.RESPONSE) {
    
      print("出现异常404 503");
    } else if (e.type == DioErrorType.CANCEL) {

      print("请求取消");
    } else {

      print("未知错误");
    }
  }

  /*
   * 取消请求
   *
   * 同一个cancel token 可以用于多个请求,当一个cancel token取消时,所有使用该cancel token的请求都会被取消。
   * 所以参数可选
   */
  void cancelRequests(CancelToken token) {
    token.cancel("cancelled");
  }
}

上一篇下一篇

猜你喜欢

热点阅读