Swagger 是一個規範和完整的框架,如今愈來愈多的項目採用先後端分離,API成了後端與前端溝通的紐帶,API的文檔也變得愈來愈重要。使得這個集文檔在線自動生成+美觀+測試於一身的框架Swagger愈來愈受歡迎。前端
咱們以前經過Word、Excel手動編寫的接口文檔或者說是第三方的api文檔管理工具(小幺雞等),你們有沒有遇到如下狀況:shell
Swagger完美(這就跟開發平常的開發習慣息息相關了,要及時更新代碼註釋)解決了以上的問題,Swagger在API開發新版本或者迭代版本的時候,只須要更新Swagger描述文件,就能夠自動生成接口文檔和客戶端服務端代碼,作到調用端代碼、服務端代碼以及接口文檔的一致性;json
#region Swagger配置 services.AddSwaggerGen(swg => { swg.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info { Version = "v1", Title = "Study.NetCore API", Description = "API-說明文檔", TermsOfService = "None", Contact = new Swashbuckle.AspNetCore.Swagger.Contact { Name = "Study.NetCore", Email = "", Url = "" } }); }); #endregion
#region 啓動Swagger app.UseSwagger(); app.UseSwaggerUI(swg => { swg.SwaggerEndpoint("/swagger/v1/swagger.json", "APIExplainDoc"); }); #endregion
#region 啓動Swagger app.UseSwagger(); app.UseSwaggerUI(swg => { swg.SwaggerEndpoint("/swagger/v1/swagger.json", "APIExplainDoc"); swg.RoutePrefix = ""; }); #endregion
#region Swagger配置 services.AddSwaggerGen(swg => { swg.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info { Version = "v1", Title = "Study.NetCore API", Description = "API-說明文檔", TermsOfService = "None", Contact = new Swashbuckle.AspNetCore.Swagger.Contact { Name = "Study.NetCore", Email = "", Url = "" } }); var bashPath = PlatformServices.Default.Application.ApplicationBasePath; var xmlPath = Path.Combine(bashPath, "Study.NetCore.xml"); swg.IncludeXmlComments(xmlPath, true);//這個是controller的註釋 }); #endregion
添加實體類的說明:基本和api的配置一致,首先勾選XML文檔文件,而後在ConfigureServices中修改swagger配置,以下:後端
#region Swagger配置 services.AddSwaggerGen(swg => { swg.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info { Version = "v1", Title = "Study.NetCore API", Description = "API-說明文檔", TermsOfService = "None", Contact = new Swashbuckle.AspNetCore.Swagger.Contact { Name = "Study.NetCore", Email = "", Url = "" } }); var bashPath = PlatformServices.Default.Application.ApplicationBasePath; var xmlPath = Path.Combine(bashPath, "Study.NetCore.xml"); swg.IncludeXmlComments(xmlPath, true);//這個是controller的註釋 //model的Xml文件 var xmlModelPath = Path.Combine(bashPath, "Study.NetCore.Model.xml"); swg.IncludeXmlComments(xmlModelPath); }); #endregion
[ApiExplorerSettings(IgnoreApi = true)]
說到版本控制,咱們第一時間想到的是Git、SVN等的源代碼版本管理器,版本控制,顧名思義,就是對程序代碼,文件等的變動管理,多個版本保證代碼更改後有跡可循,可實時恢復以前版本;這就是項目的版本控制,而咱們今天說的是對API的版本控制,下面咱們藉助swagger實現對api的版本控制。api
namespace Study.NetCore.SwaggerHelper { /// <summary> /// 版本控制 /// </summary> public class VersionControl { /// <summary> /// 接口版本號 /// </summary> public enum ApiVersion { /// <summary> /// v1版本 /// </summary> v1 = 1, /// <summary> /// v2版本 /// </summary> v2 = 2, } } }
private const string apiName = "Study.NetCore";
#region Swagger配置 var bashPath = PlatformServices.Default.Application.ApplicationBasePath; services.AddSwaggerGen(swg => { //遍歷版本號展現 typeof(ApiVersion).GetEnumNames().ToList().ForEach(version => { swg.SwaggerDoc(version, new Swashbuckle.AspNetCore.Swagger.Info { Version = version, Title = $"{apiName} API", Description = $"{apiName} API" + version, TermsOfService = "None", Contact = new Swashbuckle.AspNetCore.Swagger.Contact { Name = $"{apiName}", Email = "", Url = "" } }); }); var xmlPath = Path.Combine(bashPath, "Study.NetCore.xml"); swg.IncludeXmlComments(xmlPath, true);//這個是controller的註釋 var xmlModelPath = Path.Combine(bashPath, "Study.NetCore.Model.xml");//model的Xml文件 swg.IncludeXmlComments(xmlModelPath); }); #endregion
#region 啓動Swagger app.UseSwagger(); /* * 以前只有一個版本,因此固定寫死 * 遍歷接口版本,並倒敘展現 */ app.UseSwaggerUI(swg => { typeof(ApiVersion).GetEnumNames().OrderByDescending(ver => ver).ToList().ForEach(version => { swg.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"StudyNetCore API {version}"); swg.RoutePrefix = ""; }); }); #endregion
namespace Study.NetCore.SwaggerHelper { /// <summary> /// 自定義路由 /api/{version}/[controler]/[action] /// </summary> [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] public class ApiRouteAttribute : RouteAttribute, IApiDescriptionGroupNameProvider { /// <summary> /// 分組名稱,是來實現接口 IApiDescriptionGroupNameProvider /// </summary> public string GroupName { get; set; } /// <summary> /// 自定義路由構造函數,繼承基類路由 /// </summary> /// <param name="actionName"></param> public ApiRouteAttribute(string actionName = "[action]") : base("/api/{version}/[controller]/" + actionName) { } ///// <summary> /// 自定義版本+路由構造函數,繼承基類路由 /// </summary> /// <param name="actionName"></param> /// <param name="version"></param> public ApiRouteAttribute(ApiVersion version, string actionName = "") : base($"/api/{version.ToString()}/[controller]/{actionName}") { GroupName = version.ToString(); } } }
namespace Study.NetCore.Controllers { [Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { /// <summary> /// 測試註釋有沒有加上1 /// </summary> /// <returns></returns> [HttpGet] public ActionResult<IEnumerable<string>> Get() { return new string[] { "value1", "value2" }; } [HttpGet] //和上邊的版本控制以及路由地址都是同樣的 [ApiRouteAttribute(ApiVersion.v2, "TestV2")] public string TestV2() { return "我是老二"; } [HttpGet("Test")] public string Test() { return "我是老大"; } } }