Files
food_hub_app/lib/utils/HttpUtil.dart
2025-07-14 19:43:41 +08:00

223 lines
5.4 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<String, dynamic> 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<String, dynamic>) {
// 服务器返回标准JSON错误格式
print(responseData['message']?.toString());
showErrorToast('错误');
} else {
// 非JSON格式错误
print('网络错误: ${e.message}');
}
}
return handler.next(e);
},
),
);
}
// 基础请求方法(处理所有类型的请求)
Future<T?> _request<T>(
String path, {
required String method,
dynamic data,
Map<String, dynamic>? 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<T?> get<T>(
String path, {
Map<String, dynamic>? queryParameters,
T Function(dynamic data)? converter,
}) => _request(
path,
method: "GET",
queryParameters: queryParameters,
converter: converter,
);
// POST请求
Future<T?> post<T>(
String path, {
dynamic data,
Map<String, dynamic>? queryParameters,
T Function(dynamic data)? converter,
}) => _request(
path,
method: "POST",
data: data,
queryParameters: queryParameters,
converter: converter,
);
// PUT请求
Future<T?> put<T>(
String path, {
dynamic data,
Map<String, dynamic>? queryParameters,
T Function(dynamic data)? converter,
}) => _request(
path,
method: "PUT",
data: data,
queryParameters: queryParameters,
converter: converter,
);
// DELETE请求
Future<T?> delete<T>(
String path, {
dynamic data,
Map<String, dynamic>? queryParameters,
T Function(dynamic data)? converter,
}) => _request(
path,
method: "DELETE",
data: data,
queryParameters: queryParameters,
converter: converter,
);
// 文件上传
Future<dynamic> upload(
String path,
String filePath, {
Map<String, dynamic>? 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");
}
}
}