ps:环境是AspNet.Core3.1 WebApi项目
1、Nuget 引入 Swashbuckle.AspNetCore 包
注意:AspNet.Core3.1项目 引入Swashbuckle.AspNetCore 包必须是v5.0 以上的包。
2、Startup 类下的 ConfigureServices方法 引入 Swagger
services.AddSwaggerGen(c =>{ c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); });
3、Startup 类下的 Configure里 使用 Swagger
//启用中间件服务生成Swagger作为JSON终结点 app.UseSwagger(); //启用中间件服务对swagger-ui,指定Swagger JSON终结点 app.UseSwaggerUI(c=> { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); c.RoutePrefix = string.Empty; });
4、终结点里添加MapConTrollers();
app.UseEndpoints(endpoints =>{
endpoints.MapControllers();
});
5、控制器添加路由和api特性
6、Route 可以添加约束
/// <summary> /// 根据id获取UserName /// </summary> /// <param name="id">最大20</param> /// <returns></returns> [HttpGet("{id:max(20)}")] public string GetUseName(int id) { var result = _userService.GetUserName(); return result; }
效果如下图所示:
6、自定义约束
6.1:需要继承 IRouteConstraint 接口 并且实现 里面唯一的 Match方法
public class MyRouteConstraint : IRouteConstraint { /// <summary> /// /// </summary> /// <param name="httpContext">当前请求的上下文</param> /// <param name="route">路由对象</param> /// <param name="routeKey">当前路由参数的key</param> /// <param name="values">RouteValueDictionary 则是控制器、方法、参数的键值对</param> /// <param name="routeDirection">RouteDirection枚举则是判断是不是url传入寻找方法</param> /// <returns></returns> public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) { if (RouteDirection.IncomingRequest == routeDirection) { var v = values[routeKey]; if (v.ToString() == "lwq") { return true; } } return false; } }
6.2:在 Startup 类下注入 MyRouteConstranint 约束
services.AddRouting(options =>{ options.ConstraintMap.Add("MyRouteConstranint", typeof(MyRouteConstraint)); });
6.3:接口控制器使用自定义约束
/// <summary> /// 判断是不是lwq /// </summary> /// <param name="name">必须是lwq</param> /// <returns></returns> [HttpGet("{name:MyRouteConstranint}")] public bool IsLwq(string name) { return true; }
效果如下图所示:
7、如果想如上图所示,添加备注提示,则需要在项目右键属性 生成 xml 文档文件打√,AddSwaggerGen里配置路径。