Flutter Dio 请求封装

622 阅读1分钟

dio 新版请求库的封装,基于最新版,需要先请求token后再继续其他请求操作,修改http可直接使用

import 'dart:async';
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:shared_preferences/shared_preferences.dart';

class Request {
  static Future request<T>(String path,
      {String method, Map params, data}) async {
    Response response;

    var dio = Dio();
    var tokenDio = Dio();
    dio.options.baseUrl = "https://www.xxxx.net/api/v1";
    dio.options.connectTimeout = 50000;
    dio.options.receiveTimeout = 3000;
    // dio.options.contentType = "application/x-www-form-urlencoded";
    dio.options.headers["Authorization"] = 'xxxx';
    dio.options.responseType = ResponseType.plain;
    tokenDio.options = dio.options;

    try {
      dio.interceptors.add(
        InterceptorsWrapper(onRequest: (options, handler) async {
          print(options.method);
          print(params);
          print(path);
          SharedPreferences prefs = await SharedPreferences.getInstance();
          var token = prefs.getString("token");
          if (token == null) {
            dio.lock();
            print('无token,开始请求匿名');
            tokenDio.post('/user/anonymous').then((d) {
              var t = json.decode(d.data)['token'];
              prefs.setString('token', t);
              options.headers['token'] = t;
              handler.next(options);
            }).catchError((error, stackTrace) {
              handler.reject(error, true);
            }).whenComplete(() => dio.unlock()); // unlock the dio
          } else {
            print(token);
            options.headers['Authorization'] = token;
            handler.next(options);
          }
        }, onResponse: (response, handler) {
          handler.resolve(response);
        }, onError: (DioError e, handler) {
          print(e);
          handler.reject(e);
        }),
      );
      if (method == 'get') {
        response = await dio.get(path, queryParameters: params);
      } else {
        response = await dio.post(path, data: data);
      }
      if (response.statusCode == 200) {
        if (json.decode(response.data)['code'] == 0 ||
            json.decode(response.data)['code'] == 10004) {
          print('获取数据成功!');
          print(response.data);
          return json.decode(response.data);
        } else {
          print(response.data);
        }
      } else {
        throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
      }
    } catch (e) {
      print('ERROR:======> ${e}');
    }
  }
}

调用

import 'package:xxx/request/request.dart';

class NewsApi {
  // 无参数
  static Future getInformationGroup() {
    return Request.request('/information_group', method: 'get');
  }
  // 有参数
  static Future getRecommend(params) {
    return Request.request('/index/recommend', method: 'get', params: params);
  }
}