Swagger是一個與語言無關的規範,用於描述REST API。由於Swagger項目已捐贈給OpenAPI計劃,因此也叫OpenAPI。它容許計算機和人員瞭解服務的功能,能夠直接在線訪問測試API功能。而Swagger UI提供了基於Web的UI,它使用生成的Swagger規範提供有關服務API的信息。Swashbuckle和NSwag均包含Swagger UI的嵌入式版本,所以可以使用中間件註冊調用將該嵌入式版本託管在ASP.NET Core應用程序當中。Swagger的核心是Swagger規範,默認狀況下是名爲swagger.json的文檔。它由Swagger工具鏈(或其第三方實現)根據你的服務生成。它描述了API的功能以及使用HTTP對其進行訪問的方式。它驅動Swagger UI,並由工具鏈用來啓用發現和客戶端代碼生成。json
NET Swagger實現分爲兩大分類:
●Swashbuckle.AspNetCore是一個開源項目,用於生成ASP.NET Core Web API的Swagger文檔。
●NSwag是另外一個用於生成Swagger文檔並將Swagger UI或ReDoc集成到ASP.NET Core Web API中的開源項目。此外,NSwag 還提供了爲API生成C#和TypeScript客戶端代碼的方法。
可是因爲工做比較忙,我就不打算兩個類型都講了,我只選擇Swashbuckle.AspNetCore來說解和演示。api
Swashbuckle有三個主要組成部分:
Swashbuckle.AspNetCore.Swagger:將SwaggerDocument對象公開爲JSON終結點的Swagger對象模型和中間件。
Swashbuckle.AspNetCore.SwaggerGen:從路由、控制器和模型直接生成SwaggerDocument對象的Swagger生成器。它一般與Swagger終結點中間件結合,以自動公開Swagger JSON。
Swashbuckle.AspNetCore.SwaggerUI:Swagger UI工具的嵌入式版本。它解釋Swagger JSON以構建描述Web API功能的可自定義的豐富體驗,它包括針對公共方法的內置測試工具。
安裝Swashbuckle組件方法有兩種:架構
--PowerShell Install-Package Swashbuckle.AspNetCore -Version 5.0.0
orapp
--.NET Core CLI dotnet add TodoApi.csproj package Swashbuckle.AspNetCore -v 5.0.0
我百度一下,度娘解釋是:REST是(Representational State Transfer)「表現層狀態轉移」的縮寫,它是由羅伊·菲爾丁(Roy Fielding)提出的,是用來描述建立HTTP API的標準方法,他發現這四種經常使用的行爲「查看(view),建立(create),編輯(edit)和刪除(delete)」均可以直接映射到HTTP中已實現的GET、POST、PUT和DELETE方法。async
將Swagger生成器添加到Startup.ConfigureServices方法中的服務集合中:工具
//註冊Swagger生成器,定義一個或多個Swagger文檔. services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1", Description = "測試描述" }); });
OpenApiInfo對象是用來標識Swagger文檔信息(諸如做者、許可證和說明的信息),您還能夠自定義您的主題的信息顯示在UI上,詳情配置,我就很少說,你們能夠看官網描述,如上述OpenApilnfo信息配置示例圖:
而在啓動應用程序後並導航到http://localhost:<port>/swagger/v1/swagger.json。生成的描述終結點的文檔顯示在Swagger規範(swagger.json)中:
在Startup.Configure方法中,啓用中間件爲生成的JSON文檔和Swagger UI提供服務:visual-studio
//使中間件可以將生成的Swagger用做JSON端點. app.UseSwagger(); //容許中間件爲swagger ui(HTML、JS、CSS等)提供服務,指定swagger JSON端點. app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); });
根據上述配置就可以啓用swagger測試API服務接口了,以下圖所示:
測試
swagger還能夠把服務API中對應方法名稱,實體屬性註釋給在UI上顯示出來,讓您更加直觀瞭解每一個方法使用信息,並對沒有註釋每一個方法進行警告提示,具體啓用XML註釋操做在「解決方案資源管理器」中右鍵單擊該項目,而後選擇「編輯<project_name>.csproj」,手動將突出顯示的行添加到.csproj 文件:ui
<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
在啓用了XML註釋後,swagger只會針對沒有添加註釋每一個方法進行警告提示,而添加了註釋的方法則不會進行警告提示:
而每一個添加了註釋的方法會經過在Startup.ConfigureServices/services.AddSwaggerGen中設置Swagger JSON和UI的註釋路徑後:
//設置Swagger JSON和UI的註釋路徑.spa
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); c.IncludeXmlComments(xmlPath);
會在項目根目錄生成的一個對應項目文件名的XML文件,而文件裏面就包含全部已註釋的方法,用於UI上顯示:
在啓動應用程序後,咱們會看到每一個有註釋方法在左側會有一行文字描述,效果以下圖所示:
若是某個方法或者類下面全部方法不想警告提示,能夠經過加入#pragma warning disable聲明屏蔽警告提示:
加入聲明以後,你們會看到警告提示消失了。
可使用System.ComponentModel.DataAnnotations命名空間中的屬性來標記模型實體,以幫助驅動Swagger UI 組件。將[Required]屬性添加到TodoItem類的Name屬性:
namespace TodoApi.Models { public class TodoItem { public long Id { get; set; } [Required] public string Name { get; set; } [DefaultValue(false)] public bool IsComplete { get; set; } } }
此屬性的狀態會更改掉基礎JSON架構:
而將[Produces("application/json")]屬性添加到API控制器去,這樣作的目的是聲明控制器的操做支持application/json的響應內容類型:
[Produces("application/json")] [Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { /// <summary> /// 獲取值 /// </summary> /// <returns></returns> // GET api/values [HttpGet] public async Task<ActionResult<IEnumerable<string>>> Get() { var result = await new GitHubApi().GetUser(); return new string[] { result.id.Value.ToString(), result.login }; } }
「響應內容類型」下拉列表選此內容類型做爲控制器的默認GET操做:
Swagger/OpenAPI出現,大大減小開發者調試時間,增長開發者開發效率,讓開發者更加方便調試跟直觀瞭解對應服務方法。
參考文獻:
Swashbuckle和ASP.NET Core入門