initHttpClient function
void
initHttpClient()
Implementation
void initHttpClient() {
final cfg = getConfig();
if (cfg.apiUrl.isEmpty ||
cfg.secretKey.isEmpty ||
cfg.apiKey.isEmpty ||
cfg.verificationId.isEmpty) {
throw StateError(
'HttpClient: Configuración de inicialización incompleta. Llama a apacuana.init() primero.',
);
}
_dio = Dio(
BaseOptions(
baseUrl: cfg.apiUrl,
headers: {
'APACUANA-API-Key': cfg.apiKey,
'APACUANA-SECRET-Key': cfg.secretKey,
},
connectTimeout: const Duration(milliseconds: 30000),
receiveTimeout: const Duration(milliseconds: 30000),
sendTimeout: const Duration(milliseconds: 30000),
responseType: ResponseType.json,
),
);
// Interceptores para traducir errores y validar respuestas lógicas { success: false }
_dio!.interceptors.add(
InterceptorsWrapper(
onResponse: (response, handler) {
final data = response.data;
if (data is Map && data['success'] == false) {
final message = (data['msg'] ??
data['message'] ??
'Error lógico desconocido desde la API.')
.toString();
final code = (data['code'] ?? 'LOGICAL_API_ERROR').toString();
final status = response.statusCode ?? 200;
final apiErr = ApacuanaAPIError(
message,
statusCode: status,
errorCode: code,
);
return handler.reject(
DioException(
requestOptions: response.requestOptions,
response: response,
error: apiErr,
type: DioExceptionType.badResponse,
),
);
}
handler.next(response);
},
onError: (e, handler) {
// Log de error similar a console.error del JS
// ignore: avoid_print
print(
'[HTTP Client] Interceptor de error de Dio: ${e.response ?? e.message}');
if (e.response != null) {
final status = e.response!.statusCode ?? 0;
final data = e.response!.data;
String message = 'Error desconocido desde la API.';
String code = 'API_ERROR';
if (data is Map) {
message = (data['msg'] ?? data['message'] ?? message).toString();
code = (data['code'] ?? code).toString();
}
final apiErr = ApacuanaAPIError(
message,
statusCode: status,
errorCode: code,
);
return handler.reject(
DioException(
requestOptions: e.requestOptions,
response: e.response,
error: apiErr,
type: DioExceptionType.badResponse,
),
);
}
// Errores de red / timeouts / CORS-like (en entornos web)
if (e.type == DioExceptionType.connectionTimeout ||
e.type == DioExceptionType.sendTimeout ||
e.type == DioExceptionType.receiveTimeout ||
e.type == DioExceptionType.connectionError) {
final apiErr = ApacuanaAPIError(
'Error de conexión a la red, timeout o CORS.',
statusCode: 0,
errorCode: 'NETWORK_ERROR',
);
return handler.reject(
DioException(
requestOptions: e.requestOptions,
error: apiErr,
type: e.type,
),
);
}
// Desconocido al configurar la petición
final apiErr = ApacuanaAPIError(
'Error desconocido en la petición: ${e.message}',
statusCode: 0,
errorCode: 'UNKNOWN_REQUEST_ERROR',
);
return handler.reject(
DioException(
requestOptions: e.requestOptions,
error: apiErr,
type: e.type,
),
);
},
),
);
}