import 'dart:io'; import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'global.dart'; class Http { static final Http _instance = Http._internal(); // 单例模式使用Http类, factory Http() => _instance; static late final Dio dio; final CancelToken _cancelToken = CancelToken(); Http._internal() { // BaseOptions、Options、RequestOptions 都可以配置参数,优先级别依次递增,且可以根据优先级别覆盖参数 BaseOptions options = BaseOptions(); dio = Dio(options); // // 添加request拦截器 // dio.interceptors.add(RequestInterceptor()); // // 添加error拦截器 dio.interceptors.add(ErrorInterceptor()); // // // 添加cache拦截器 // dio.interceptors.add(NetCacheInterceptor()); // // // 添加retry拦截器 // dio.interceptors.add( // RetryOnConnectionChangeInterceptor( // requestRetrier: DioConnectivityRequestRetrier( // dio: dio, // connectivity: Connectivity(), // ), // ), // ); // 在调试模式下需要抓包调试,所以我们使用代理,并禁用HTTPS证书校验 // if (PROXY_ENABLE) { // (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = // (client) { // client.findProxy = (uri) { // return "PROXY $PROXY_IP:$PROXY_PORT"; // }; // //代理工具会提供一个抓包的自签名证书,会通不过证书校验,所以我们禁用证书校验 // client.badCertificateCallback = // (X509Certificate cert, String host, int port) => true; // }; // } } ///初始化公共属性 /// /// [baseUrl] 地址前缀 /// [connectTimeout] 连接超时赶时间 /// [receiveTimeout] 接收超时赶时间 /// [interceptors] 基础拦截器 void init({ String? baseUrl, int connectTimeout = 1500, int receiveTimeout = 1500, Map? headers, List? interceptors, }) { dio.options = dio.options.copyWith( baseUrl: baseUrl, // connectTimeout: connectTimeout, //引起报错 Future already completed receiveTimeout: receiveTimeout, headers: headers ?? const {}, ); // 在初始化http类的时候,可以传入拦截器 if (interceptors != null && interceptors.isNotEmpty) { dio.interceptors.addAll(interceptors); } } // 关闭dio void cancelRequests({required CancelToken token}) { _cancelToken.cancel("cancelled"); } // 添加认证 // 读取本地配置 Map? getAuthorizationHeader() { Map headers = { 'X-Client-Type':kIsWeb?"WEB":Platform.isAndroid ? "ANDROID" : "IOS", 'X-Client-Version':'1.0', 'X-App-Version':'1.0', 'Access-Control-Allow-Origin':'*' }; // headers['Authorization'] = 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJhY2NvdW50Iiwic3ViIjoidGVzdCIsImlzcyI6IkNPREVQQUFTLkNPTSIsIm5pY2tuYW1lIjoidGVzdCIsInR5cCI6IkJlYXJlciIsInNlc3Npb25fc3RhdGUiOiIzMjJhMzRkNzlkZWQxN2E4ZWMyYmJlNWVlZmJhNjQ4NyIsImV4cCI6MTY5MTU5NTMxOSwiaWF0IjoxNjYwMDU5MzE5fQ.A0Z3m_2WAj4DOJLdu42jXnUeX0X3T0-HkdU4BNtJ_8k'; // 从getx或者sputils中获取 // String accessToken = Global.accessToken; String accessToken = Global().token; if (accessToken.isNotEmpty) { headers['Authorization']='Bearer $accessToken'; } else { headers['Authorization'] = 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNzUyOTA4NDhiODNkYjNlOTQ5ZmEwMzBiYTU0OTliNjgiLCJpc3MiOiJDT0RFUEFBUy5DT00iLCJuaWNrbmFtZSI6IueDrSIsInR5cCI6IkJlYXJlciIsInNlc3Npb25fc3RhdGUiOiI0MGU2ODZlMjg1ZGQ5OTdkNjlkNWNjOGVkMWZmZGE5NCIsImV4cCI6MTY5MzU1NTI4OSwiaWF0IjoxNjYyMDE5MjkwfQ.xcTj1OUiwAlMG7KAr9QG9obxZi1d2Vi8rCeJPT_Mmtc'; } return headers; } Future get( String path, { Map? params, Options? options, CancelToken? cancelToken, bool refresh = false, bool noCache = true, String? cacheKey, bool cacheDisk = false, }) async { Options requestOptions = options ?? Options(); requestOptions = requestOptions.copyWith( extra: { "refresh": refresh, "noCache": noCache, "cacheKey": cacheKey, "cacheDisk": cacheDisk, }, ); Map? _authorization = getAuthorizationHeader(); if (_authorization != null) { requestOptions = requestOptions.copyWith(headers: _authorization); } // try { Response response; response = await dio.get( path, queryParameters: params, options: requestOptions, cancelToken: cancelToken ?? _cancelToken, ); return response.data; // } on DioError catch (e) { // if (e.response) // // return e.response!.data; // } } Future post( String path, { Map? params, data, Options? options, CancelToken? cancelToken, }) async { Options requestOptions = options ?? Options(); Map? _authorization = getAuthorizationHeader(); if (_authorization != null) { requestOptions = requestOptions.copyWith(headers: _authorization); } var response = await dio.post( path, data: data, queryParameters: params, options: requestOptions, cancelToken: cancelToken ?? _cancelToken, ); if (response.data is String){ return Map(); } return response.data; } Future put( String path, { data, Map? params, Options? options, CancelToken? cancelToken, }) async { Options requestOptions = options ?? Options(); Map? _authorization = getAuthorizationHeader(); if (_authorization != null) { requestOptions = requestOptions.copyWith(headers: _authorization); } var response = await dio.put( path, data: data, queryParameters: params, options: requestOptions, cancelToken: cancelToken ?? _cancelToken, ); return response.data; } Future patch( String path, { data, Map? params, Options? options, CancelToken? cancelToken, }) async { Options requestOptions = options ?? Options(); Map? _authorization = getAuthorizationHeader(); if (_authorization != null) { requestOptions = requestOptions.copyWith(headers: _authorization); } var response = await dio.patch( path, data: data, queryParameters: params, options: requestOptions, cancelToken: cancelToken ?? _cancelToken, ); return response.data; } Future delete( String path, { data, Map? params, Options? options, CancelToken? cancelToken, }) async { Options requestOptions = options ?? Options(); Map? _authorization = getAuthorizationHeader(); if (_authorization != null) { requestOptions = requestOptions.copyWith(headers: _authorization); } var response = await dio.delete( path, data: data, queryParameters: params, options: requestOptions, cancelToken: cancelToken ?? _cancelToken, ); return response.data; } } class ErrorInterceptor extends Interceptor { @override void onError(DioError err, ErrorInterceptorHandler handler) { if (err.response!.statusCode == 401) { // print('9527'); // if (Global().showLogin){ // return; // } // Global().mainPage.logout(); // Global().showLogin = true; return; } // if (err.response!.statusCode == 500) { // print('9527'); // return; // } // if (err.response!.statusCode == 422) { // // print('9527逆龄石不足'); // return; // } // if (err.response!.statusCode != 200) { // // ignore: void_checks // return err.response!.data; // } super.onError(err, handler); } @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { // TODO: implement onRequest super.onRequest(options, handler); } @override void onResponse(Response response, ResponseInterceptorHandler handler) { // TODO: implement onResponse super.onResponse(response, handler); } }