swagger_generator_flutter/lib/pipeline/parse/impl/swagger_fetcher.dart

84 lines
2.3 KiB
Dart

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<String> 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<String> _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<String> _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(),
);
}
}
}