import 'package:dio/dio.dart'; import 'package:food_hub_app/widgets/common/index.dart'; import 'package:tdesign_flutter/tdesign_flutter.dart'; class HttpUtil { static final HttpUtil _instance = HttpUtil._internal(); factory HttpUtil() => _instance; late Dio _dio; String baseUrl = "http://172.29.101.108:8100/"; // 请求头配置 Map headers = { 'Content-Type': 'application/json;charset=UTF-8', 'Accept': 'application/json', }; // 超时时间 final int timeout = 5; HttpUtil._internal() { // 初始化Dio实例 BaseOptions options = BaseOptions( baseUrl: baseUrl, connectTimeout: Duration(seconds: timeout), receiveTimeout: Duration(seconds: timeout), headers: headers, ); _dio = Dio(options); // 添加请求拦截器 _dio.interceptors.add( InterceptorsWrapper( onRequest: (options, handler) { print("请求URL: ${options.uri}"); if (options.data != null) { print("请求参数: ${options.data}"); } // 可以在此添加token等操作 // options.headers['Authorization'] = 'Bearer your_token'; return handler.next(options); }, ), ); // 添加响应拦截器 _dio.interceptors.add( InterceptorsWrapper( onResponse: (response, handler) { print("响应状态码: ${response.statusCode}"); print("响应数据: ${response.data}"); return handler.next(response); }, ), ); // 添加错误拦截器 _dio.interceptors.add( InterceptorsWrapper( onError: (DioException e, handler) { if (e.response != null) { final responseData = e.response?.data; if (responseData is Map) { // 服务器返回标准JSON错误格式 print(responseData['message']?.toString()); showErrorToast('错误'); } else { // 非JSON格式错误 print('网络错误: ${e.message}'); } } return handler.next(e); }, ), ); } // 基础请求方法(处理所有类型的请求) Future _request( String path, { required String method, dynamic data, Map? queryParameters, T Function(dynamic data)? converter, }) async { try { Response response = await _dio.request( path, data: data, queryParameters: queryParameters, options: Options(method: method), ); // 处理响应数据 if (converter != null) { return converter(response.data); } // 如果没有转换器且T是dynamic,直接返回原始数据 if (T == dynamic) { return response.data as T; } // 没有转换器时尝试直接返回(可能不安全,建议提供转换器) return response.data as T?; } catch (e) { _handleError(e); rethrow; } } // GET请求 Future get( String path, { Map? queryParameters, T Function(dynamic data)? converter, }) => _request( path, method: "GET", queryParameters: queryParameters, converter: converter, ); // POST请求 Future post( String path, { dynamic data, Map? queryParameters, T Function(dynamic data)? converter, }) => _request( path, method: "POST", data: data, queryParameters: queryParameters, converter: converter, ); // PUT请求 Future put( String path, { dynamic data, Map? queryParameters, T Function(dynamic data)? converter, }) => _request( path, method: "PUT", data: data, queryParameters: queryParameters, converter: converter, ); // DELETE请求 Future delete( String path, { dynamic data, Map? queryParameters, T Function(dynamic data)? converter, }) => _request( path, method: "DELETE", data: data, queryParameters: queryParameters, converter: converter, ); // 文件上传 Future upload( String path, String filePath, { Map? queryParameters, }) async { try { FormData formData = FormData.fromMap({ 'file': await MultipartFile.fromFile(filePath), }); Response response = await _dio.post( path, data: formData, queryParameters: queryParameters, ); return response.data; } catch (e) { _handleError(e); rethrow; } } // 错误处理 void _handleError(dynamic error) { if (error is DioException) { switch (error.type) { case DioExceptionType.connectionTimeout: print("连接超时"); break; case DioExceptionType.sendTimeout: print("发送超时"); break; case DioExceptionType.receiveTimeout: print("接收超时"); break; case DioExceptionType.cancel: print("请求取消"); break; case DioExceptionType.badCertificate: print("证书错误"); case DioExceptionType.badResponse: print("错误响应"); case DioExceptionType.connectionError: print("连接错误"); case DioExceptionType.unknown: print("未知错误"); break; } } else { print("未知错误: $error"); } } }