美文网首页
flutter 拦截器+头部配置token

flutter 拦截器+头部配置token

作者: 有一种感动叫做丶只有你懂 | 来源:发表于2019-10-21 10:33 被阅读0次
    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");
      }
    }
    
    

    相关文章

      网友评论

          本文标题:flutter 拦截器+头部配置token

          本文链接:https://www.haomeiwen.com/subject/ybuopctx.html