import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:shared_preferences/shared_preferences.dart'; import './secure_http_client.dart'; class ApiClient { final http.Client _httpClient; final SharedPreferences _prefs; ApiClient(this._prefs) : _httpClient = SecureHttpClient.createSecureClient(); // 获取认证头 Map _getHeaders({bool withAuth = true}) { final headers = { 'Content-Type': 'application/json', 'Accept': 'application/json', }; if (withAuth) { final token = _prefs.getString('access_token'); if (token != null && token.isNotEmpty) { headers['Authorization'] = 'Bearer $token'; } } return headers; } // 通用POST请求 Future post( String url, Map body, {bool withAuth = false} ) async { try { final response = await _httpClient.post( Uri.parse(url), headers: _getHeaders(withAuth: withAuth), body: json.encode(body), ); return response; } catch (e) { throw Exception('网络请求失败: $e'); } } // 通用GET请求 Future get( String url, {bool withAuth = true} ) async { try { final response = await _httpClient.get( Uri.parse(url), headers: _getHeaders(withAuth: withAuth), ); return response; } catch (e) { throw Exception('网络请求失败: $e'); } } // 通用PUT请求 Future put( String url, Map body, {bool withAuth = true} ) async { try { final response = await _httpClient.put( Uri.parse(url), headers: _getHeaders(withAuth: withAuth), body: json.encode(body), ); return response; } catch (e) { throw Exception('网络请求失败: $e'); } } // 保存tokens Future saveTokens(String accessToken, String? refreshToken) async { await _prefs.setString('access_token', accessToken); if (refreshToken != null && refreshToken.isNotEmpty) { await _prefs.setString('refresh_token', refreshToken); } } // 清除所有token Future clearTokens() async { await _prefs.remove('access_token'); await _prefs.remove('refresh_token'); } // 获取refresh_token String? getRefreshToken() { return _prefs.getString('refresh_token'); } // 检查是否已登录 bool isLoggedIn() { final token = _prefs.getString('access_token'); return token != null && token.isNotEmpty; } }