import 'dart:io'; import 'package:http/http.dart' as http; import 'package:swagger_generator_flutter/core/config.dart'; import 'package:swagger_generator_flutter/core/exceptions.dart'; import 'package:swagger_generator_flutter/utils/logger.dart'; import 'package:swagger_generator_flutter/utils/path_resolver.dart'; /// Swagger 数据获取器 /// 负责从本地文件或远程 URL 获取 Swagger 文档内容 class SwaggerFetcher { /// 获取 Swagger 文档内容 /// [url] 可以是本地文件路径 (file://) 或远程 URL (http://, https://) Future fetch(String url) async { appLogger.info('🔄 正在获取Swagger JSON文档: $url'); if (url.startsWith('http://') || url.startsWith('https://')) { return _fetchFromUrl(url); } else { return _fetchFromFile(url); } } /// 从远程 URL 获取 Future _fetchFromUrl(String url) async { try { final response = await http.get( Uri.parse(url), headers: SwaggerConfig.httpHeaders, ); if (response.statusCode == 200) { return response.body; } else { throw SwaggerParseException( 'HTTP请求失败', url: url, statusCode: response.statusCode, details: 'HTTP响应状态码: ${response.statusCode}', ); } } catch (e) { if (e is SwaggerParseException) rethrow; throw SwaggerParseException( '获取远程Swagger文档失败', url: url, details: e.toString(), ); } } /// 从本地文件获取 Future _fetchFromFile(String url) async { try { // 移除 file:// 前缀(如果有) var filePath = url; if (filePath.startsWith('file://')) { filePath = filePath.substring(7); } // 使用 PathResolver 解析路径 final resolvedPath = PathResolver.resolvePath(filePath); final file = File(resolvedPath); if (!file.existsSync()) { throw SwaggerParseException( '本地文件不存在', url: url, details: '文件路径: $resolvedPath', ); } return await file.readAsString(); } catch (e) { if (e is SwaggerParseException) rethrow; throw SwaggerParseException( '读取本地Swagger文件失败', url: url, details: e.toString(), ); } } }