如何构建可扩展的MAUI PicoServer REST API框架实现实战?

摘要:MAUI 嵌入式 Web 架构实战(三) 构建可扩展的 PicoServer REST API 框架 源码地址: https:github.comdensen2014MauiPicoAdmin 一、从简单 API 到可扩展架构 在上
MAUI 嵌入式 Web 架构实战(三) 构建可扩展的 PicoServer REST API 框架 源码地址: https://github.com/densen2014/MauiPicoAdmin 一、从简单 API 到可扩展架构 在上一篇文章 《MAUI 嵌入式 Web 架构实战(二)》 中,我们已经成功构建了多个 PicoServer API,例如: /api/time /api/product/list /api/product/detail 这些接口已经可以: 处理 HTTP 请求 返回 JSON 数据 支持简单的参数读取 例如: http://127.0.0.1:8090/api/product/list 返回: { "code":0, "message":"ok", "data":[] } 这意味着我们的 MAUI 应用已经具备了: 本地 REST API 服务能力 但随着接口数量增加,新的问题会逐渐出现: API 全部写在一个类中 HTTP 逻辑和业务逻辑混在一起 返回格式不统一 错误处理难以维护 例如: class PicoAdmin { ProductList() ProductDetail() ProductAdd() ProductDelete() } 当接口数量达到: 50+ 100+ 200+ 代码就会变得难以维护。 因此,本篇文章将对 PicoServer 进行一次 架构升级。 目标是构建一个: 可扩展的本地 REST API 框架结构 核心目标包括: API 模块化 Controller / Service 分层 统一返回结构 统一异常处理 清晰的项目结构 二、REST API 框架核心架构 升级后的 API 架构如下: HTTP Request │ ▼ PicoServer │ Router │ Controller │ Service │ Data / Device / Logic 各层职责: 层 作用 Router 路由分发 Controller HTTP 请求处理 Service 业务逻辑 Data / Device 数据或设备操作 这种结构与常见 Web 框架(如 ASP.NET Core)非常类似。 三、推荐项目目录结构 为了让 API 更易维护,可以采用如下结构: Server ├─ Controllers │ ├─ ProductController.cs │ └─ SystemController.cs │ ├─ Services │ └─ ProductService.cs │ ├─ Models │ └─ ApiResult.cs │ └─ PicoServerHost.cs 目录职责说明: 目录 作用 Controllers API 路由处理 Services 业务逻辑 Models 数据模型 PicoServerHost 服务器启动与路由注册 这种结构可以保持代码清晰、模块化。 四、统一 API 返回结构 在 API 系统中,统一返回格式非常重要。 我们先定义一个返回模型。 ApiResult.cs public class ApiResult { public int Code { get; set; } public string Message { get; set; } public object Data { get; set; } public static ApiResult Success(object data) { return new ApiResult { Code = 0, Message = "ok", Data = data }; } public static ApiResult Error(string msg) { return new ApiResult { Code = 1, Message = msg }; } } 统一 JSON 返回格式: { "code":0, "message":"ok", "data":{} } 优点: 前端解析统一 错误处理简单 API 结构规范 五、Service 层(业务逻辑) 业务逻辑应该与 HTTP 处理分离。 创建: ProductService.cs public class ProductService { public List<object> GetProducts() { return new List<object> { new { id = 1, name = "Apple", price = 10 }, new { id = 2, name = "Orange", price = 8 } }; } public object GetProduct(string id) { return new { id = id, name = "Demo Product", price = 100 }; } } 职责: Controller → 调用 Service Service → 处理业务逻辑 好处: 业务逻辑可复用 Controller 更简洁 易于维护和扩展 六、Controller 层(API 入口) Controller 负责: 接收 HTTP 请求 读取参数 调用 Service 返回 JSON 创建: ProductController.cs public class ProductController { private ProductService service = new ProductService(); public async Task List(HttpListenerRequest request, HttpListenerResponse response) { var data = service.GetProducts(); var result = ApiResult.Success(data); string json = JsonSerializer.Serialize(result); response.ContentType = "application/json"; await response.WriteAsync(json); } public async Task Detail(HttpListenerRequest request, HttpListenerResponse response) { string id = request.QueryString["id"]; var data = service.GetProduct(id); var result = ApiResult.Success(data); string json = JsonSerializer.Serialize(result); response.ContentType = "application/json"; await response.WriteAsync(json); } } Controller 的职责非常清晰: HTTP Request ↓ 读取参数 ↓ 调用 Service ↓ 返回 JSON 七、统一注册路由 接下来创建服务器启动类: PicoServerHost.cs public class PicoServerHost { private readonly WebAPIServer api = new WebAPIServer(); public PicoServerHost() { RegisterRoutes(); api.StartServer(); } private void RegisterRoutes() { var product = new ProductController(); api.AddRoute("/api/product/list", product.List); api.AddRoute("/api/product/detail", product.Detail); } } 完整调用流程变成: HTTP Request ↓ PicoServer Router ↓ Controller ↓ Service ↓ Data / Device 这种结构已经非常接近一个 轻量级 Web 框架。 八、统一 JSON 输出工具 为了让 Controller 更简洁,可以封装一个工具方法。 public static class HttpHelper { public static async Task WriteJson(HttpListenerResponse response, object obj) { string json = JsonSerializer.Serialize(obj); await response.WriteAsync(json, contentType: "application/json"); } } Controller 就可以写成: await HttpHelper.WriteJson(response, ApiResult.Success(data)); 代码会更简洁。 九、统一异常处理 在 API 系统中,建议统一捕获异常: try { var data = service.GetProducts(); await HttpHelper.WriteJson(response, ApiResult.Success(data)); } catch(Exception ex) { await HttpHelper.WriteJson(response, ApiResult.Error(ex.Message)); } 这样可以保证: API 永远返回 JSON 不会出现 HTML 错误页 前端可以统一处理错误 最终把 MauiProgram.cs 的 class PicoAdmin 去掉, 初始化 new PicoAdmin()改为 var picoAdmin = new PicoServerHost(); //实例化PicoAdmin以启动PicoServer var picoAdmin = new PicoServerHost(); 十、升级后的完整架构 经过本篇改造后,整个系统结构如下: 浏览器 / WebView ↓ HTTP ↓ PicoServer ↓ Router ↓ Controller ↓ Service ↓ Data / Device 优势: API 清晰 模块化结构 易扩展 易维护 此时,我们已经拥有了一个: 轻量级嵌入式 REST API 框架 十一、下一步可以继续扩展 在当前架构基础上,可以继续扩展很多能力。 例如: 中间件系统 日志 鉴权 请求过滤 CORS Token 登录系统 /api/login /api/user/info Web Admin 后台 结合前端框架: Vue React Admin Dashboard 实现完整管理系统。 十二、本篇总结 在本篇文章中,我们完成了 PicoServer API 架构升级: 新增能力: API 分层结构 Controller / Service 架构 统一 JSON 返回 路由统一注册 异常处理机制 至此,我们的 MAUI 应用已经具备: 一个可扩展的本地 REST API 服务框架 这也是后续构建 Web Admin 管理后台 的基础。 下一篇预告 下一篇将进入一个非常关键的部分: 《MAUI 嵌入式 Web 架构实战(四)》 静态文件托管与前端框架整合 我们将实现: 托管 HTML / CSS / JS 托管 Vue / React 构建产物 设置默认首页 构建真正的 本地 Web Admin 系统 最终架构将变成: 浏览器 ↓ localhost:8090 ↓ Web Admin UI ↓ PicoServer API ↓ MAUI 本地逻辑