Swagger是一個規範且完整的框架,用於生成、描述、調試和可視化Restfull風格的Web服務。Swagger的目標是對Rest API定義一個標準且和語言無關的介面,可以讓人和電腦擁有無需訪問源碼、文檔或網路流量監控就可以發現和連接服務的能力。當通過Swagger進行正確定義,用於可以理解遠... ...
一、Swagger簡介
1.1-什麼是Swagger?
- Swagger是一個規範且完整的框架,用於生成、描述、調試和可視化Restfull風格的Web服務。
- Swagger的目標是對Rest API定義一個標準且和語言無關的介面,可以讓人和電腦擁有無需訪問源碼、文檔或網路流量監控就可以發現和連接服務的能力。當通過Swagger進行正確定義,用於可以理解遠程服務並使用最少邏輯與遠程服務進行交互。與為底層編程所實現的介面類似,Swagger消除了調用服務時可能會有的猜測。
1.2-Swagger有什麼優勢?
- 支持API自動生成同步的線上文檔:使用Swagger後可以直接通過代碼生成文檔,不需要自己去手動編寫介面文檔了,對程式員來說是非常方便。
- 提供Web頁面線上測試API:光有文檔還不夠,Swagger生成的文檔還支持線上測試。參數和格式都一定定義好了,直接在界面上輸出參數對應的值即可在先測試介面。
- Swagger可以生成客戶端SDK代碼用於各種不同平臺的實現。
- Swagger文件可以在許多不同的平臺上從代碼註釋中自動生成。
- Swagger有一個強大的社區,裡面有許多強悍的貢獻者。
1.3-Swagger、OpenAPI3.0、Restful API的區別?
- Open API:OpenAPI是規範的正式名稱。該規範的開發時由OpenAPI Initative推動的。該提倡涉及不同領域的30個組織——包括Microsoft、Google、IBM和CapitalOne.
- Swagger:實現OpenAPI規範的工具之一。
- RestfulAPI:是一種WebAPI設計架構風格。其中Rest即Represntaional State Transfer的縮寫,可以翻譯為"狀態表述轉換"。是目前比較成熟的一套互聯網應用程式的API設計架構風格OpenAPI規範即是這個架構風格的具體實現規範。
1.4-Swagger工具
1.5-Swagger UI工具主要功能
- 介面的文檔線上自動生成
- 功能測試等
1.6-Swashbuckle組件
- Swashbuckle是.NET Core中對Swagger的封裝,他有2個核心組件:
- Swashbuckle.SwaggerGen:提供生成對象、方法、返回類型等JSON Swagger文檔的功能。
- Swashbuckle.SwaggerUI:是一個嵌入式版本的SwaggerUI工具,使用Swagger UI強大的富文本表現形式可定製化的來描述Web API的功能,並且包含內置的公共方法測試工具。
1.7-TPL
- 任務並行庫(TPL)是System.Threading.Tasks命名空間中的一組公共類型和API
- TPL動態的擴展併發度,以最有效的使用可用的處理器。通過使用TPL,您可以最大限度的提高代碼的性能,同時專註於您的代碼業務。
- 從.NETFramework4開始,TPL是編寫多線程和並行代碼的首選方式。
二、在ASP.NET Core Web API中使用Swagger UI
2.1-創建一個WebAPI項目
2.2-下載、安裝、引入【Swashbuckle.AspNetCore】包
右擊【解決方案】,然後點擊【管理Nuget包】,搜索【Swashbuckle.AspNetCore】包,點擊【安裝】即可,博主這裡下載的是【最新穩定版5.6.3】。
2.3-配置Swagger中間件(註冊 Swagger 服務)
在【Startup.cs】文件中的【ConfigureService】類中引入命名空間,並註冊Swagger服務並配置文檔信息。
//引入命名空間
using Microsoft.OpenApi.Models;
//註冊Swagger
services.AddSwaggerGen(u => {
u.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo
{
Version = "Ver:1.0.0",//版本
Title = "xxx後臺管理系統",//標題
Description = "xxx後臺管理系統:包括人員信息、團隊管理等。",//描述
Contact=new Microsoft.OpenApi.Models.OpenApiContact {
Name="西瓜程式猿",
Email="[email protected]"
}
});
});
如果安裝的 Swashbuckle.AspNetCore Nuget包版本<= 3.0.0,寫法略有不同。將 【OpenApiInfo】 替換成 【Info】 即可。
services.AddSwaggerGen(x =>
{
x.SwaggerDoc("v1", new Info() { Title = "Web Api", Version = "v1" });
});
2.4-啟用Swagger中間件
在【Startup.cs】文件中的【Configure】類中啟用Swagger中間件,為生成的JSON文檔和SwaggerUI提供服務。
//啟用Swagger中間件
app.UseSwagger();
//配置SwaggerUI
app.UseSwaggerUI(u =>
{
u.SwaggerEndpoint("/swagger/v1/swagger.json", "WebAPI_v1");
});
2.5-運行項目即可
2.5.1-如果我們直接運行項目,會出現這樣的界面,說明我們的Web API程式沒有問題。
2.5.1-然後我們在地址欄中輸入【swagger/v1/swagger.json】。
可以看到瀏覽器出現這樣的界面,如果出現這樣的界面,說明Swagger也沒有問題。
註意:按照2.5.1在地址欄中的【swagger/v1/swagger.json】需要與在【Startup.cs】文件中的【Configure】類中啟用Swagger中間件添加的代碼保持一致,因為這段代碼就是自動生成JSON文件的,你配置的路徑和JSON文件地址是什麼,就在瀏覽器中輸入對應的即可。
2.5.1-以上步驟都沒問題的話,然後我們地址欄中輸入【swagger/index.html】。
如果能出現以下界面,說明SwaggerUI也沒有問題,都全部正常了。
2.6-如果想每次運行都預設直接到Swagger的頁面
2.6.1-打開【launchSettings.json】這個文件。
2.6.2-然後將【launchUrl】的值從【weatherforecast】修改成【swagger】。
2.6.3-然後運行項目就直接進入Swagger首頁了。
2.7-描述信息詳細講解
三、啟用XML註釋
3.1-雙擊解決方案
3-2-然後進入這個頁面,加上這個代碼
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>$(NoWarn);1591</NoWarn>
3-3.在【Startup.cs】文件中的【ConfigureService】類中註冊讀取XML信息的Swagger。
#region 讀取xml信息
// 使用反射獲取xml文件,並構造出文件的路徑
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
// 啟用xml註釋,該方法第二個參數啟用控制器的註釋,預設為false.
u.IncludeXmlComments(xmlPath, true);
#endregion
註意:
- 對於Linux或者非Windows操作系統,文件名和路徑區分大小寫。例如“MyWebApiUseSwagger.xml”文件在Windows上有效,但在CentOS上是無效的。
- 獲取應用程式路徑,建議採用Path.GetDirectoryName(typeof(Program).Assembly.Location)這種方式或者·AppContext.BaseDirectory這樣來獲取
四、實例
4.1-寫一個實例:在【WeatherForecastController】控制器中寫一個方法。
4.2-寫上以下代碼然後進行請求。
/// <summary>
/// 這是一個例子
/// </summary>
/// <remarks>
/// 描述:這是一個帶參數的GET請求
/// Web API
/// </remarks>
/// <param name="id">主鍵ID</param>
/// <returns>測試字元串</returns>
[HttpGet("{id}")]
public ActionResult<string> Get(int id) {
return $"你請求的ID是:{id}";
}
4.3-可以看到【XML註釋】起作用了,然後調用也成功了。
五、小知識點
5.1-當入參/出參返回object或者匿名類時,也需要加上註釋怎麼辦?
(1)在方法中加上以下特性:
[ProducesResponseType(typeof(xxx),200)]
(2)在Remarks節點下進行註釋:
5.2-如何隱藏介面:有介面但是不想讓別人看到?
在需要進行隱藏的介面上加上以下特性即可:
[ApiExplorerSettings(IgnoreApi =true)]
5.3-設置路由首碼/自定義頭內容/網頁標題
如果不想加上"swagger",而輸入5000即可訪問,也可以自定義路由首碼,加上以下代碼即可。
5.3-自定義首頁
(1)新建一個【index.html】,右擊該文件,點擊【屬性】,進行設置相關操作。
(2)在Startup.cs進行配置。
(3)靜態頁面下載地址:
https://github.com/swagger-api/swagger-ui/blob/master/dist/index.html
5.4-開啟JWT認證
(1)在Startup.cs進行配置。
#region 開啟JWT
u.OperationFilter<SecurityRequirementsOperationFilter>();
u.AddSecurityDefinition("oauth2", new Microsoft.OpenApi.Models.OpenApiSecurityScheme
{
Description = "JWT授權(數據將在請求頭中進行傳輸)直接在下框中輸入Bearer { token } (註意兩者之間是一個空格) ",
Name = "Authorization",
In = Microsoft.OpenApi.Models.ParameterLocation.Header,//jwt預設存放Authorazation信息的位置(請求頭中)
Type = Microsoft.OpenApi.Models.SecuritySchemeType.ApiKey
});
#endregion
(2)下載包,註意版本號問題,儘量保持一致,不然會報錯。
(3)然後將介面加上許可權,去請求該介面,可以看到請求頭中會有以下信息了。
5.5-使用Cookie持久化存儲Token,解決每次刷新需要重新輸入Token授權
目錄結構:
(1)在【index.html】文件導入abp.js/swagger.js文件。
(2)在【swagger.js】裡面需要註意請求授權地址。
(3)後端授權邏輯。