如果希望接口是每次通过配置文件生成的,这样设计一些低代码的方式来获得接口。
系统目录结构:
启动配置代码:
using Microsoft.AspNetCore.Hosting;
using System.Configuration;
using System.Data.Entity;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Reflection;
using AutoMapDBCreateApi.Models;
using AutoMapDBCreateApi.Filters;var builder = WebApplication.CreateBuilder(args);var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: false, reloadOnChange: true).Build();var endpointsConfig = configuration.GetSection("Endpoints").Get<List<EndpointConfig>>();builder.Services.AddControllers();builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "动态接口管理Swagger平台", Version = "v1" });// 为 Swagger 设置xml文档注释路径var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);c.IncludeXmlComments(xmlPath);// 添加自定义扩展c.DocumentFilter<DynamicEndpointsOperationFilter>();
});var app = builder.Build();// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI(c =>{c.SwaggerEndpoint("/swagger/v1/swagger.json", "动态接口管理Swagger平台");});
}
app.UseRouting();
//app.UseAuthentication(); // 启用认证中间件
//app.UseAuthorization(); // 启用授权中间件app.UseEndpoints(endpoints =>
{foreach (var endpointConfig in endpointsConfig){// 动态生成接口endpoints.MapMethods(endpointConfig.Path, new[] { endpointConfig.Method }, async context =>{//var id = context.Request.RouteValues["id"] as string;var routeParams = context.Request.RouteValues; // 获取路由参数var queryParams = context.Request.Query; // 获取查询参数var headerParams = context.Request.Headers; // 获取请求头参数var id = queryParams["id"].FirstOrDefault();if (!string.IsNullOrEmpty(id)){await context.Response.WriteAsync("id:"+id+","+endpointConfig.Response);}// 返回预定义的响应await context.Response.WriteAsync(endpointConfig.Response);});}
});app.MapControllers();app.UseEndpoints(endpoints =>
{endpoints.MapControllers();
});app.Run();
动态接口过滤器代码:
using AutoMapDBCreateApi.Models;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;namespace AutoMapDBCreateApi.Filters
{/// <summary>/// 动态接口过滤器/// </summary>public class DynamicEndpointsOperationFilter : IDocumentFilter{/// <summary>/// /// </summary>/// <param name="swaggerDoc"></param>/// <param name="context"></param>public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context){// 读取接口配置数据,例如从数据库或配置文件中获取// var endpointsConfig = new List<EndpointConfig>//{// new EndpointConfig { Path = "/api/customers", Method = "GET", Summary = "Dynamic Customers Endpoint", Description = "This is a dynamically generated endpoint for customers." },// new EndpointConfig { Path = "/api/orders", Method = "POST", Summary = "Dynamic Orders Endpoint", Description = "This is a dynamically generated endpoint for orders." }//};var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: false, reloadOnChange: true).Build();// 读取接口配置数据var endpointsConfig = configuration.GetSection("Endpoints").Get<List<EndpointConfig>>();foreach (var endpointConfig in endpointsConfig){// 创建动态生成的接口var path = endpointConfig.Path;var method = endpointConfig.Method;OpenApiOperation operation;if (endpointConfig.Path.Contains("/api/customers")){operation = new OpenApiOperation{Tags = new List<OpenApiTag> { new OpenApiTag { Name = endpointConfig.GroupName } },Summary = endpointConfig.Summary,Description = endpointConfig.Description,Parameters = new List<OpenApiParameter>() { new OpenApiParameter() { AllowEmptyValue = false,Required=true,Name = "id" ,Description="传入的Id",Schema=new OpenApiSchema() { Type="Int"},In=ParameterLocation.Query } },Responses = new OpenApiResponses()};}else{operation = new OpenApiOperation{Tags = new List<OpenApiTag> { new OpenApiTag { Name = endpointConfig.GroupName } },Summary = endpointConfig.Summary,Description = endpointConfig.Description,Parameters = new List<OpenApiParameter>(),Responses = new OpenApiResponses()};}// 根据需要添加请求参数、响应定义等swaggerDoc.Paths.Add(path, new OpenApiPathItem{Operations = new Dictionary<OperationType, OpenApiOperation>{{ GetOperationType(method), operation }}});}}private OperationType GetOperationType(string method){return method switch{"GET" => OperationType.Get,"POST" => OperationType.Post,"PUT" => OperationType.Put,"DELETE" => OperationType.Delete,_ => throw new NotSupportedException($"Unsupported HTTP method: {method}")};}}
}