86 lines
2.8 KiB
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');
|
|
}
|
|
}
|
|
}
|