starwork_flutter/lib/api/base_api_service.dart

86 lines
2.8 KiB
Dart

// api/service/user_api_service.dart
import 'package:dio/dio.dart' as dioAlias;
import 'package:starwork_flutter/api/api_response.dart';
import 'package:starwork_flutter/flavors.dart';
class BaseApiService {
final dioAlias.Dio dio = dioAlias.Dio();
BaseApiService() {
dio.options.baseUrl = F.apiHost;
dio.options.connectTimeout = const Duration(seconds: 30);
dio.options.receiveTimeout = const Duration(seconds: 30);
// 可添加拦截器、token 等
}
/// 统一请求方法(私有,但子类可用)
Future<ApiResponse<T>> makeRequest<T>({
required String path,
String method = 'GET',
dynamic data,
Map<String, dynamic>? queryParameters,
required T Function(dynamic) fromJson,
}) async {
try {
dioAlias.Response response;
switch (method.toUpperCase()) {
case 'GET':
response = await dio.get(path, queryParameters: queryParameters);
break;
case 'POST':
response = await dio.post(path,
data: data, queryParameters: queryParameters);
break;
case 'PUT':
response =
await dio.put(path, data: data, queryParameters: queryParameters);
break;
case 'DELETE':
response = await dio.delete(path,
data: data, queryParameters: queryParameters);
break;
case 'PATCH':
response = await dio.patch(path,
data: data, queryParameters: queryParameters);
break;
default:
return ApiResponse.error('Unsupported method: $method');
}
if (response.statusCode! >= 200 && response.statusCode! < 300) {
final parsedData = fromJson(response.data);
return ApiResponse.success(
parsedData,
statusCode: response.statusCode,
message: 'Success',
);
} else {
return ApiResponse.error(
response.statusMessage ?? 'Request failed',
statusCode: response.statusCode,
);
}
} on dioAlias.DioException catch (e) {
String message = 'Unknown error';
int? statusCode = e.response?.statusCode;
if (e.type == dioAlias.DioExceptionType.connectionTimeout) {
message = 'Connection timeout';
} else if (e.type == dioAlias.DioExceptionType.receiveTimeout) {
message = 'Server timeout';
} else if (e.type == dioAlias.DioExceptionType.badResponse) {
message = e.response?.statusMessage ?? 'Bad response';
} else if (e.type == dioAlias.DioExceptionType.connectionError) {
message = 'Network not available';
} else {
message = e.message ?? 'Something went wrong';
}
return ApiResponse.error(message, statusCode: statusCode);
} catch (e) {
return ApiResponse.error('Unexpected error: $e');
}
}
}