import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:cookie_jar/cookie_jar.dart'; import 'package:device_info/device_info.dart'; import 'package:dio/dio.dart'; import 'package:dio_cookie_manager/dio_cookie_manager.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.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) { print(value.runtimeType); //文件不参与签名 if(value.runtimeType.toString() != "_File"&&value.runtimeType.toString() != "MultipartFile") { list.add("$key=$value"); } }); //排序 list.sort(); String signStr = ""; list.forEach((element) { signStr += element + "&"; }); print("签名字符串:$signStr"); signStr += "BuWan*@_%MakeMoney!!"; 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 ??= {}; //判断params中是否有文件类型 List fileKeys = []; params.forEach((key, value) async { print("$key: ${value.runtimeType}"); if (value.runtimeType.toString() == "_File") { fileKeys.add(key); } }); for (int i = 0; i < fileKeys.length; i++) { params[fileKeys[i]] = await MultipartFile.fromFile((params[fileKeys[i]] as File).path); } 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["packages"] = "com.yeshi.makemoney.video"; Global.utdId = "testtest"; Global.channel = "QQ"; if (Platform.isAndroid) { if (Global.utdId != null) { params["utdId"] = 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["sign"] = _getSign(params); return fileKeys.isNotEmpty ? FormData.fromMap(params) : params; } static var cookieJar = CookieJar(); static Future baseRequest(BuildContext context, String api, Map params, OnHttpRequestStart? onStart, {bool notifyError = false}) async { // params ??= {}; dynamic paramsNew = await getBaseParams(params); if (onStart != null) { onStart(); } HttpRequestResult requestResult; try { var dio = Dio() ..options = BaseOptions( baseUrl: "http://api.dsp.yeshitv.com", connectTimeout: 20000, receiveTimeout: 1000 * 60, contentType: "application/x-www-form-urlencoded"); dio.interceptors.add(CookieManager(cookieJar)); //设置代理 // (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: paramsNew, onSendProgress: (int sent, int 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; } }