import 'dart:convert'; import 'dart:io'; import 'package:bbyyy/beans/simple_bean.dart'; import 'package:bbyyy/my_tools/easy_loading/easy_loading.dart'; import 'package:bbyyy/my_tools/event_bus.dart'; import 'package:bbyyy/my_tools/global.dart'; import 'package:bbyyy/my_tools/my_apis.dart'; import 'package:bbyyy/my_tools/my_cookie.dart'; import 'package:bbyyy/my_tools/my_tools.dart'; import 'package:bbyyy/my_tools/s.dart'; import 'package:bbyyy/paegs/root_page/root_page_view.dart'; import 'package:dio/adapter.dart'; import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:simple_logger/simple_logger.dart'; ///http请求成功回调 typedef SCallBack = void Function(Response response, bool hasError); ///失败回调 typedef FCallBack = void Function(DioError error); final logger = SimpleLogger(); class MyDio { //私有构造函数 MyDio._internal() { initDio(); } //保存单例 static MyDio _singleton = MyDio._internal(); //工厂构造函数 factory MyDio() => _singleton; Dio dio; // 使用默认配置 BaseOptions options; initDio() { // 或者通过传递一个 `options`来创建dio实例 options = BaseOptions( baseUrl: MyCookie().getServer(), connectTimeout: 20000, receiveTimeout: 20000, ); if (MyCookie().loginInformation != null) { options.headers = { '${MyApis.getApi('token')}': MyCookie().getToken(), '${MyApis.getApi('user')}': MyCookie().getUser(), 'Content-Type': 'application/json' }; } dio = Dio(options); print('fmamisfmaifmasi1'); } cancelRequest(){ dio.clear(); } post(String url, data, SCallBack sCallBack, FCallBack fCallBack) async { // (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) { // client.badCertificateCallback=(X509Certificate cert, String host, int port){ // return true; // }; // }; // (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) { // print('fmamisfmaifmasi'); // SecurityContext sc = SecurityContext(); // // file is the path of certificate // sc.setTrustedCertificates('assets/bby.crt'); // HttpClient httpClient = HttpClient(context: sc); // return httpClient; // }; logger.info(MyCookie().getServer() + url); try { logger.info(json.encode(data)); } catch (e) {} try { Response re = await dio.post(url, data: data); print(dio.options.headers); logger.info(MyCookie().getServer() + url); try { logger.info(json.encode(data)); } catch (e) {} logger.info(re.data); if (await checkingReturnParameter(re.data)) { sCallBack(re, false); // EasyLoading.dismiss(); } else { sCallBack(re, true); } } on DioError catch (e) { switch (e.type) { case DioErrorType.cancel: fCallBack(e); EasyLoading.showToast('请求已取消'); break; case DioErrorType.connectTimeout: fCallBack(e); EasyLoading.showToast('链接超时'); if(!MyCookie().switching){ changeServer(); } break; case DioErrorType.other: fCallBack(e); EasyLoading.showToast('网络错误'); if(!MyCookie().switching){ changeServer(); } break; case DioErrorType.receiveTimeout: fCallBack(e); EasyLoading.showToast('接受超时'); break; case DioErrorType.response: fCallBack(e); EasyLoading.showToast('服务器异常'); if(!MyCookie().switching){ changeServer(); } break; case DioErrorType.sendTimeout: fCallBack(e); EasyLoading.showToast('网络不佳'); break; default: fCallBack(e); EasyLoading.showToast('网络出错'); if(!MyCookie().switching){ changeServer(); } } } } get(String url, SCallBack sCallBack, FCallBack fCallBack) async { try { Response re = await dio.get(url); logger.info(MyCookie().getServer() + url); logger.info(re.data); if (await checkingReturnParameter(re.data)) { sCallBack(re, false); // EasyLoading.dismiss(); } else { sCallBack(re, true); } } on DioError catch (e) { switch (e.type) { case DioErrorType.cancel: fCallBack(e); EasyLoading.showToast('请求已取消'); break; case DioErrorType.connectTimeout: fCallBack(e); EasyLoading.showToast('您的网络不稳定,请稍后重试'); break; case DioErrorType.other: fCallBack(e); EasyLoading.showToast('您的网络不稳定,请稍后重试'); break; case DioErrorType.receiveTimeout: fCallBack(e); EasyLoading.showToast('您的网络不稳定,请稍后重试'); break; case DioErrorType.response: fCallBack(e); EasyLoading.showToast('您的网络不稳定,请稍后重试'); break; case DioErrorType.sendTimeout: fCallBack(e); EasyLoading.showToast('您的网络不稳定,请稍后重试'); break; default: fCallBack(e); EasyLoading.showToast('您的网络不稳定,请稍后重试'); } } } query(data, SCallBack sCallBack, FCallBack fCallBack) { post(MyApis.getApi('query'), data, sCallBack, fCallBack); } save(data, SCallBack sCallBack, FCallBack fCallBack) { post(MyApis.getApi('save'), data, sCallBack, fCallBack); } del(data, SCallBack sCallBack, FCallBack fCallBack) { post(MyApis.getApi('delete'), data, sCallBack, fCallBack); } update(data, SCallBack sCallBack, FCallBack fCallBack) { post(MyApis.getApi('update'), data, sCallBack, fCallBack); } updateM(data, SCallBack sCallBack, FCallBack fCallBack) { post(MyApis.getApi('updateM'), data, sCallBack, fCallBack); } loginUpload(File _image, String user, String token, SCallBack sCallBack, FCallBack fCallBack, BuildContext context) async { var s = '${MyApis.getApi('upload')}?token=$token&user=$user'; logger.info(MyCookie().getServer() + s); var name = _image.path .substring(_image.path.lastIndexOf("/") + 1, _image.path.length); print(name); FormData formData = new FormData.fromMap({ '${MyApis.getApi('files')}': await MultipartFile.fromFile( _image.path, filename: name, ), }); post(s, formData, sCallBack, fCallBack); } upload(File _image, SCallBack sCallBack, FCallBack fCallBack, BuildContext context) async { var s = '${MyApis.getApi('upload')}?${MyCookie().getUT()}'; logger.info(MyCookie().getServer() + s); var name = _image.path .substring(_image.path.lastIndexOf("/") + 1, _image.path.length); print(name); FormData formData = new FormData.fromMap({ '${MyApis.getApi('files')}': await MultipartFile.fromFile( _image.path, filename: name, ), }); post(s, formData, sCallBack, fCallBack); } loginUpdate(data, String user, String token, SCallBack sCallBack, FCallBack fCallBack, BuildContext context) { String s = '/rdm/update?token=$token&user=$user'; logger.info(MyCookie().getServer() + s); post(s, data, sCallBack, fCallBack); } Future checkingReturnParameter(data) async { SimpleBean simpleBean; try { simpleBean = SimpleBean.fromJson(json.decode(data)); } catch (e) { print(e); } if (simpleBean != null) { if (simpleBean.error == null || simpleBean.error.length == 0) { return true; } else { EasyLoading.showToast(simpleBean.error); if (simpleBean.error.contains('token') || simpleBean.error.contains('会话过期,请重新登录') || simpleBean.error.contains('登录失效,请重新登录')) { MyCookie().clean(); cancelRequest(); RootPageView().bNIndex = 0; navigatorKey.currentState.pushNamedAndRemoveUntil( '/loginPage', ModalRoute.withName("/loginPage")); } return false; } } else { return false; } } void changeServer() { MyCookie().switching = true; List salt = MyCookie().getLoginInformation().data.extra.salt; print('salt.length=======${salt.toString()}'); if(salt==null||salt.length==0){ MyCookie().prefs.setString('using', ''); }else{ w: for (int i = 0; i < salt.length; i++) { if (MyCookie().prefs.getString('using') == null || MyCookie().prefs.getString('using').isEmpty || MyCookie().prefs.getString('using') == '') { MyCookie().prefs.setString('using', salt[i]); break w; } else if (!MyCookie().prefs.getString('using').contains(salt[i])) { MyCookie().prefs.setString( 'using', '${MyCookie().prefs.getString('using')},${salt[i]}'); break w; } if (i == salt.length - 1 && MyCookie().prefs.getString('using').contains(salt[i])) { MyCookie().prefs.setString('using', ''); } } } if(MyCookie().prefs.getString('using')==''){ MyCookie().prefs.setString('timestamp', ''); MyCookie().prefs.setString('uid', ''); MyCookie().prefs.setString('serverID', ''); EventBus().emit('服务器异常,请稍后再试'); MyCookie().switching = false; }else{ MyCookie().prefs.setString( 'timestamp', MyCookie().getLoginInformation().data.extra.timestamp); MyCookie().prefs.setString( 'uid', MyCookie().getLoginInformation().data.extra.uid.toString()); s().encryption(); RootPageView().bNIndex = 0; cancelRequest(); MyCookie().reNum++; MyCookie().switching = false; navigatorKey.currentState.pushNamedAndRemoveUntil( '/loginPage', ModalRoute.withName("/loginPage")); } } }