From 0fee2d7f69648f72ec547e45471ddca199b4108e Mon Sep 17 00:00:00 2001 From: qmqz Date: Wed, 15 Jan 2025 09:55:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81flutter=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/EasyDartModule.dart | 2 +- lib/base/http/TraceDio.dart | 4 +-- lib/base/logger/Logger.dart | 4 ++- lib/base/logger/impl/LokiLogger.dart | 25 ++++++++------ lib/base/webserver/WebServer.dart | 21 +++++++++++- lib/base/webserver/impl/ShelfWebServer.dart | 16 +++++++-- .../webserver/impl/ShelfWebServer_none.dart | 33 +++++++++++++++++++ 7 files changed, 88 insertions(+), 17 deletions(-) create mode 100644 lib/base/webserver/impl/ShelfWebServer_none.dart diff --git a/lib/EasyDartModule.dart b/lib/EasyDartModule.dart index 70e1d68..92e7e36 100644 --- a/lib/EasyDartModule.dart +++ b/lib/EasyDartModule.dart @@ -12,7 +12,7 @@ import 'package:EasyDartModule/base/redis/redis.dart'; import 'package:EasyDartModule/base/storage/Storage.dart'; import 'package:EasyDartModule/base/storage/impl/MinIoStorage.dart'; import 'package:EasyDartModule/base/webserver/WebServer.dart'; -import 'package:EasyDartModule/base/webserver/impl/ShelfWebServer.dart'; +import 'package:EasyDartModule/base/webserver/impl/ShelfWebServer.dart' if (dart.library.html) 'package:EasyDartModule/base/webserver/impl/ShelfWebServer_none.dart'; export 'package:shelf/shelf.dart'; export 'package:mongo_dart/mongo_dart.dart'; diff --git a/lib/base/http/TraceDio.dart b/lib/base/http/TraceDio.dart index c3ecab1..c2dd6f9 100644 --- a/lib/base/http/TraceDio.dart +++ b/lib/base/http/TraceDio.dart @@ -52,8 +52,8 @@ class TraceDio { }, onError: (DioException e, handler) { // 记录错误日志 - String? traceId = e.response?.headers.value('X-Trace-ID'); - String? spanId = e.response?.headers.value('X-Span-ID'); + String? traceId = e.requestOptions.headers['X-Trace-ID']; + String? spanId = e.requestOptions.headers['X-Span-ID']; _logger.error('Request failed: ${e.message}', tag: "DIO", traceId: traceId, spanId: spanId); return handler.next(e); // 继续处理错误 diff --git a/lib/base/logger/Logger.dart b/lib/base/logger/Logger.dart index 3344f92..5d89616 100644 --- a/lib/base/logger/Logger.dart +++ b/lib/base/logger/Logger.dart @@ -22,5 +22,7 @@ abstract class Logger { class LoggerConfig { String host; String serviceName; - LoggerConfig({required this.host, required this.serviceName}); + bool print; + LoggerConfig( + {required this.host, required this.serviceName, this.print = false}); } diff --git a/lib/base/logger/impl/LokiLogger.dart b/lib/base/logger/impl/LokiLogger.dart index d063216..bccae27 100644 --- a/lib/base/logger/impl/LokiLogger.dart +++ b/lib/base/logger/impl/LokiLogger.dart @@ -21,12 +21,11 @@ class LokiLogger implements Logger { final Dio dio; LoggerLevel level = LoggerLevel.info; LokiLogger(this._config) - : dio = Dio(BaseOptions( - baseUrl: _config == null ? "" : _config.host, - headers: { - "Content-Type": "application/json", - "Content-Encoding": "gzip" - })); + : dio = Dio( + BaseOptions(baseUrl: _config == null ? "" : _config.host, headers: { + "Content-Type": "application/json", + if (!identical(0, 0.0)) "Content-Encoding": "gzip" + })); @override void debug(String msg, {String? tag, String? traceId, String? spanId, String? parentSpanId}) { @@ -91,7 +90,7 @@ class LokiLogger implements Logger { var now = DateTime.now(); // 转换为纳秒 int nanoseconds = now.microsecondsSinceEpoch * 1000; - var zip = gzip.encode(utf8.encode(jsonEncode({ + var data = jsonEncode({ "streams": [ { "stream": { @@ -105,9 +104,15 @@ class LokiLogger implements Logger { ] } ] - }))); - dio.post("/loki/api/v1/push", data: zip); - if (level == LoggerLevel.debug) { + }); + //判断平台 + if (identical(0, 0.0)) { + dio.post("/loki/api/v1/push", data: data); + } else { + var zip = gzip.encode(utf8.encode(data)); + dio.post("/loki/api/v1/push", data: zip); + } + if (level == LoggerLevel.debug || _config.print) { print(log); } } diff --git a/lib/base/webserver/WebServer.dart b/lib/base/webserver/WebServer.dart index 8df7b82..035af51 100644 --- a/lib/base/webserver/WebServer.dart +++ b/lib/base/webserver/WebServer.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + abstract class WebServer { static late WebServer _webServer; @@ -24,9 +26,26 @@ enum HttpMethod { ; } +enum HttpResponseType { + HTML("text/html; charset=utf-8"), + TEXT("text/plain; charset=utf-8"), + XML("text/xml; charset=utf-8"), + JSON("application/json; charset=utf-8"), + BINARY("application/octet-stream"), + ; + + final String type; + + const HttpResponseType(this.type); +} + class RequestMapping { final HttpMethod method; final String path; + final HttpResponseType responseType; - const RequestMapping({this.method = HttpMethod.ALL, required this.path}); + const RequestMapping( + {this.method = HttpMethod.ALL, + required this.path, + this.responseType = HttpResponseType.JSON}); } diff --git a/lib/base/webserver/impl/ShelfWebServer.dart b/lib/base/webserver/impl/ShelfWebServer.dart index a4a94f8..c7439be 100644 --- a/lib/base/webserver/impl/ShelfWebServer.dart +++ b/lib/base/webserver/impl/ShelfWebServer.dart @@ -187,7 +187,7 @@ class ShelfWebServer implements WebServer { // print("method: ${m.reflectee.method} $p"); //把地址加入路由 - addRouter(m.reflectee.method, p, (req, [a, b, c, d, e, f]) { + addRouter(m.reflectee.method, p, (req, [a, b, c, d, e, f]) async { //从request中获取token并解码传入 String? token = req.headers["token"]; dynamic payload; @@ -205,7 +205,19 @@ class ShelfWebServer implements WebServer { } else { args = [req]; } - return im.invoke(v.simpleName, args).reflectee; + Response response = await im.invoke(v.simpleName, args).reflectee as Response; + //判断contenttype是否定义 + var t = response.headers["content-type"]; + + if (t == null) { + //设置默认contenttype + response = response.change(headers: { + ...response.headers, + "content-type": m.reflectee.responseType.type + }); + } + + return response; }); } } diff --git a/lib/base/webserver/impl/ShelfWebServer_none.dart b/lib/base/webserver/impl/ShelfWebServer_none.dart new file mode 100644 index 0000000..b45fe3e --- /dev/null +++ b/lib/base/webserver/impl/ShelfWebServer_none.dart @@ -0,0 +1,33 @@ +import 'package:EasyDartModule/base/logger/Logger.dart'; +import 'package:EasyDartModule/base/webserver/WebServer.dart'; + +class ShelfWebServer implements WebServer { + late Logger logger; + final String tag = "webserver"; + ShelfWebServer(this.logger); + @override + void start(int port) async {} + + @override + void stop() {} + + @override + void addHandler(handler) {} + + void addRouter(HttpMethod method, String path, dynamic handler) {} +} + +abstract class WebSocketHandler { + Map chanelMap = {}; + void open(String id); + void close(String id); + void message(String id, dynamic message); + + void sendData(String id, dynamic data) { + if (chanelMap.containsKey(id)) { + chanelMap[id].sink.add(data); + } else { + print("id未找到"); + } + } +}