minimal api 绕过 mvc 管道,直接注册端点,启动快、内存低、代码少,但无自动模型验证、过滤器链或视图渲染;参数绑定依类型和位置推断,复杂类型仅支持 json;路由宜用 mapgroup + 扩展方法封装;swagger 需 withname 和 withmetadata 补充元数据,并确保路由注册在 app.run() 前。

Minimal API 不是“简化版 MVC”,它绕过了整个 MVC 管道,直接注册端点。如果你只想要一个快速响应 JSON 的内部服务、健康检查或微服务接口,它比 Controller 启动快、内存低、代码少;但别指望它自动帮你做模型验证、过滤器链或视图渲染——这些都得手动补。
MapGet/MapPost 参数绑定怎么写才不 400
Minimal API 不看 [FromQuery] 或 [FromBody] 特性,而是靠参数类型和位置自动推断来源:
- 简单类型(
string、int、Guid)默认从路由段或查询字符串绑定,比如app.MapGet("/user/{id}", (int id) => ...)中的id会从路径取值 - 复杂类型(如
UserDto)默认只接受application/json请求体,前端发application/x-www-form-urlencoded会直接返回 400 - 想强制指定来源?必须用
AsParameters或自定义BindAsync,不能加特性——加了也无效 - 依赖注入服务要显式标记
[FromServices],例如([FromServices] IUserService svc) => svc.Get()
路由太多时怎么避免 Program.cs 变成面条代码
别把所有 MapGet 堆在 Program.cs 里。推荐用 MapGroup + 扩展方法封装:
- 用
app.MapGroup("/api/users")统一前缀,组内所有端点路径自动拼接,比如.MapGet("/") → /api/users/ - 封装为
IEndpointRouteBuilder扩展方法,例如MapUserEndpoints(),调用时只写一行:app.MapUserEndpoints() - 扩展方法里禁止调用
builder.Services.Addxxx()或提前app.Services.GetService(),否则会报No service for type 'X' has been registered - 服务应在 handler 内部按需获取:
context.RequestServices.GetRequiredService<iuserservice>()</iuserservice>
为什么加了 Swagger 却看不到分组或接口描述
Minimal API 默认不给端点打元数据标签,Swagger 就没法识别逻辑分组或生成准确文档:
- 每个
MapGet或MapPost后链式调用WithName("Users_GetAll"),让 Swagger 能显示可读名称 - 用
WithMetadata(new EndpointNameMetadata("Users"))标记归属分组,部分文档工具可据此归类 - 记得在
builder.Services中注册:AddEndpointsApiExplorer()和AddSwaggerGen(),并在app中启用中间件 - 不加
WithName,Swagger 里只会显示自动生成的随机名如GetAll_123
最常被忽略的一点:所有路由注册(MapGet、MapGroup)必须放在 app.Run() 之前,顺序错一点,接口就全 404——它不报错,只静默失效。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!









