84 lines
2.3 KiB
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(),
|
|
);
|
|
}
|
|
}
|
|
}
|