import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:device_info/device_info.dart'; import 'package:dio/adapter.dart'; import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import '../../utils/des/des.dart'; import '../../utils/share_preference.dart'; import '../model/common/http_model.dart'; import '../ui/widget/dialog.dart'; import '../utils/app_util.dart'; import '../utils/encrypt_util.dart'; import '../utils/global.dart'; import '../utils/ui_utils.dart'; typedef OnHttpRequestFinish = void Function(HttpRequestResult result); typedef OnHttpRequestStart = void Function(); showLoading(BuildContext context) { //先丢失焦点 FocusScope.of(context).unfocus(); //开启加载框 DialogUtil.showDialog(context, LoadingDialog("")); } dismissDialog(BuildContext context) { Navigator.pop(context); } class HttpUtil { static AndroidDeviceInfo? _androidInfo; static IosDeviceInfo? _iosInfo; static _getSign(Map params) { List list = []; //签名 params.forEach((key, value) { list.add("$key=$value"); }); //排序 list.sort(); String signStr = ""; list.forEach((element) { signStr += element + "&"; }); if (signStr.endsWith("&")) { signStr = signStr.substring(0, signStr.length - 1); } signStr += "8888B&*@-uWan88/',@@^"; return EncryptUtil.MD5(signStr); } static String _decode(String content) { String key = utf8.decode(base64Decode("VW1nT3R2WVk=")); String iv = utf8.decode(base64Decode("WXlIeEhsY0o=")); List result = DES().decryptWithCBC(base64Decode(content), key.codeUnits, iv: iv); return utf8.decode(result); } static Future> getBaseParams( Map? params) async { params ??= {}; if (Platform.isIOS) { String finalParams = await dataMethodChannel.invokeMethod("getBaseRequestParams", params); return jsonDecode(finalParams); } if (Platform.isAndroid) { if (_androidInfo == null) { DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); _androidInfo = await deviceInfo.androidInfo; } print("androidInfo:${_androidInfo!.version}"); params["Version"] = (await AppUtil.getVersionCode()).toString(); } else if (Platform.isIOS) { if (_iosInfo == null) { DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); _iosInfo = await deviceInfo.iosInfo; } params["Version"] = "105"; } //添加附加参数 params["Timestamp"] = DateTime.now().millisecondsSinceEpoch.toString(); params["Platform"] = "Android"; // Platform.isAndroid ? "Android" : "IOS"; params["Package"] = "com.hanju.video"; params["System"] = "1"; Global.utdId = "testtest"; Global.channel = "QQ"; if (Platform.isAndroid) { if (Global.utdId != null) { params["UtdId"] = Global.utdId; params["Device"] = Global.utdId; } params["osVersion"] = _androidInfo!.version.release; } else if (Platform.isIOS) { params["Device"] = "test123123"; //_iosInfo!.identifierForVendor; } if (Global.channel != null) { params["Channel"] = Global.channel; } //青少年模式 params["YouthMode"] = false; params["Sign"] = _getSign(params); return params; } static Future baseRequest(BuildContext context, String api, Map params, OnHttpRequestStart? onStart, {bool notifyError = false}) async { // params ??= {}; params = await getBaseParams(params); if (onStart != null) { onStart(); } HttpRequestResult requestResult; try { var dio = Dio() ..options = BaseOptions( baseUrl: "http://api.hanju.goxcw.com:8089/BuWan", connectTimeout: 20000, receiveTimeout: 1000 * 60, contentType: "application/x-www-form-urlencoded"); //设置代理 (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (HttpClient client) { client.findProxy = (uri) { return 'PROXY 192.168.3.122:8888'; }; client.badCertificateCallback = (X509Certificate cert, String host, int port) => true; }; // FormData formData = FormData.fromMap(params); var response = await dio.post( api, data: params, onSendProgress: (int sent, int total) { print('$sent $total'); }, ); if (response.statusCode == HttpStatus.ok) { String result = response.data.toString(); result = _decode(result); print("网络请求结果:$result"); requestResult = HttpRequestResult(true, jsonDecode(result)); } else { requestResult = HttpRequestResult(false, null, msg: "网络请求失败"); } } on DioError catch (_) { if (_.type == DioErrorType.connectTimeout || _.type == DioErrorType.receiveTimeout || _.type == DioErrorType.sendTimeout) { requestResult = HttpRequestResult(false, null, msg: "网络请求超时"); } else { requestResult = HttpRequestResult(false, null, msg: "网络请求出错"); } } catch (e) { requestResult = HttpRequestResult(false, null, msg: "网络请求出错"); } if (notifyError && !requestResult.success) { ToastUtil.toast(requestResult.msg!, context); } return requestResult; } }