網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
本文實(shí)例環(huán)境及版本.NetCore3.1、Swagger6.1
現(xiàn)在的開(kāi)發(fā)大部分都是前后端分離的模式了,后端提供接口,前端調(diào)用接口。后端提供了接口,需要對(duì)接口進(jìn)行測(cè)試,之前都是使用瀏覽器開(kāi)發(fā)者工具,或者寫(xiě)單元測(cè)試,再或者直接使用Postman,但是現(xiàn)在這些都已經(jīng)out了。后端提供了接口,如何跟前端配合說(shuō)明接口的性質(zhì),參數(shù)等這也是一個(gè)問(wèn)題。有沒(méi)有一種工具可以根據(jù)后端的接口自動(dòng)生成接口文檔,說(shuō)明接口的性質(zhì),參數(shù)等信息,又能提供接口調(diào)用等相關(guān)功能呢?答案是有的。Swagger 是一個(gè)規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化 RESTful 風(fēng)格的 Web 服務(wù)。而作為.net core開(kāi)發(fā),Swashbuckle是swagger應(yīng)用的首選!
總體目標(biāo)是使客戶端和文件系統(tǒng)作為服務(wù)器以同樣的速度來(lái)更新。文件的方法、參數(shù)和模型緊密集成到服務(wù)器端的代碼,允許 API 來(lái)始終保持同步。Swagger 讓部署管理和使用功能強(qiáng)大的 API 從未如此簡(jiǎn)單。
Swashbuckle.AspNetCore源碼地址:https://github.com/domaindrivendev/Swashbuckle.AspNetCore
整個(gè)swagger頁(yè)面訪問(wèn)流程如下:
1、瀏覽器輸入swaggerUI頁(yè)面地址,比如:http://localhost:5000/swagger/index.html,這個(gè)地址是可配置的
2、請(qǐng)求被SwaggerUI中間件攔截,然后返回頁(yè)面,這個(gè)頁(yè)面是嵌入的資源文件,也可以設(shè)置成外部自己的頁(yè)面文件(使用外部靜態(tài)文件攔截)
3、頁(yè)面接收到Swagger的Index頁(yè)面后,會(huì)根據(jù)SwaggerUI中間件中使用SwaggerEndpoint方法設(shè)置的文檔列表,加載第一個(gè)文檔,也就是獲取文檔架構(gòu)信息swagger.json
4、瀏覽器請(qǐng)求的swagger.json被Swagger中間件攔截,然后解析屬于請(qǐng)求文檔的所有接口,并最終返回一串json格式的數(shù)據(jù)
5、瀏覽器根據(jù)接收到的swagger,json數(shù)據(jù)呈現(xiàn)UI界面
一、Swagger基本使用
1、新建NetCore項(xiàng)目,添加相關(guān)Controller并添加引用Swashbuckle.AspNetCore.Swagger
2、在Startup中添加配置
在ConfigureServices中注入Swashbuckle服務(wù)
services.AddSwaggerGen(c => { c.SwaggerDoc("V1", new OpenApiInfo { //版本 Version = "V1", //標(biāo)題 Title = $"接口文檔-NetCore3.1", //描述 Description = $"NetCore Http API v1", //聯(lián)系方式 Contact = new OpenApiContact { Name = "測(cè)試", Email = "", Url = new Uri("https://www.cnblogs.com/mzflog/") }, License = new OpenApiLicense { Name = "測(cè)試2", Url = new Uri("https://www.cnblogs.com/mzflog/") } }); // 加載XML注釋 c.IncludeXmlComments(XmlCommentsFilePath); });
新增XmlCommentsFilePath 屬性,此時(shí)需要引用Microsoft.Extensions.PlatformAbstractions
/// <summary> /// 獲取當(dāng)前項(xiàng)目名的XML文件 /// </summary> static string XmlCommentsFilePath { get { var basePath = PlatformServices.Default.Application.ApplicationBasePath; var fileName = typeof(Startup).GetTypeInfo().Assembly.GetName().Name + ".xml"; return Path.Combine(basePath, fileName); } }
在Configure中添加Swagger中間件UseSwagger,UseSwaggerUI
UseSwagger:添加Swagger中間件,主要用于攔截swagger.json請(qǐng)求,從而可以獲取返回所需的接口架構(gòu)信息
UseSwaggerUI:添加SwaggerUI中間件,主要用于攔截swagger/index.html頁(yè)面請(qǐng)求,返回頁(yè)面給前端
app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint($"/swagger/V1/swagger.json", $"NetCore V1"); //c.RoutePrefix = string.Empty; //如果是為空 訪問(wèn)路徑就為 根域名/index.html,注意localhost:8001/swagger是訪問(wèn)不到的 //路徑配置,設(shè)置為空,表示直接在根域名(localhost:8001)訪問(wèn)該文件 c.RoutePrefix = "swagger"; // 如果你想換一個(gè)路徑,直接寫(xiě)名字即可,比如直接寫(xiě)c.RoutePrefix = "swagger"; 則訪問(wèn)路徑為 根域名/swagger/index.html });
右鍵項(xiàng)目屬性在生成中添加X(jué)ML
此時(shí)通過(guò)http://localhost:端口號(hào)/swagger即可訪問(wèn)
二、Swagger結(jié)合版本控制
版本控制的好處:
1、有助于及時(shí)推出功能, 而不會(huì)破壞現(xiàn)有系統(tǒng)。
2、它還可以幫助為選定的客戶提供額外的功能。
1、添加對(duì)Microsoft.AspNetCore.Mvc.Versioning和Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer的引用,本文使用版本4.1.0
2、在ConfigureServices中
services.AddApiVersioning(option => { // 可選,為true時(shí)API返回支持的版本信息 option.ReportApiVersions = true; // 請(qǐng)求中未指定版本時(shí)默認(rèn)為1.0 option.DefaultApiVersion = new ApiVersion(1, 0); //版本號(hào)以什么形式,什么字段傳遞 option.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version")); // 在不提供版本號(hào)時(shí),默認(rèn)為1.0 如果不添加此配置,不提供版本號(hào)時(shí)會(huì)報(bào)錯(cuò)"message": "An API version is required, but was not specified." //option.AssumeDefaultVersionWhenUnspecified = true; //默認(rèn)以當(dāng)前最高版本進(jìn)行訪問(wèn) //option.ApiVersionSelector = new CurrentImplementationApiVersionSelector(option); }).AddVersionedApiExplorer(opt => { //以通知swagger替換控制器路由中的版本并配置api版本 opt.SubstituteApiVersionInUrl = true; // 版本名的格式:v+版本號(hào) opt.GroupNameFormat = "'v'VVV"; //是否提供API版本服務(wù) opt.AssumeDefaultVersionWhenUnspecified = true; });
//方式一 (不建議使用) 此種方式報(bào)警告:ASP0000 從應(yīng)用程序代碼調(diào)用“BuildServiceProvider”會(huì)導(dǎo)致創(chuàng)建單例服務(wù)的附加副本。考慮替代方案,例如將依賴注入服務(wù)作為“配置”的參數(shù) services.AddSwaggerGen(options => { // 解析IApiVersionDescriptionProvider服務(wù) var provider = services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>(); //為每個(gè)發(fā)現(xiàn)的API版本添加一個(gè)swagger文檔 可跳過(guò)不需要記錄的 foreach (var description in provider.ApiVersionDescriptions) { options.SwaggerDoc(description.GroupName, CreateInfoForApiVersion(description)); } //加載XML注釋 并啟用控制器的注釋信息默認(rèn)為false不啟用 options.IncludeXmlComments(XmlCommentsFilePath,true); }); //方式二 (建議使用) services.AddSwaggerGen(); //解決上面報(bào)ASP0000警告的方案 services.AddOptions<SwaggerGenOptions>() .Configure<IApiVersionDescriptionProvider>((options, service) => { options.ResolveConflictingActions(apiDescriptions => apiDescriptions.First()); // 添加文檔信息 foreach (var item in service.ApiVersionDescriptions) { options.SwaggerDoc(item.GroupName, CreateInfoForApiVersion(item)); } //給swagger添加過(guò)濾器 //options.OperationFilter<SwaggerParameterFilter>(); // 加載XML注釋 options.IncludeXmlComments(XmlCommentsFilePath, true); });
添加CreateInfoForApiVersion方法
static OpenApiInfo CreateInfoForApiVersion(ApiVersionDescription description) { var info = new OpenApiInfo() { //標(biāo)題 Title = $".NET Core API for 測(cè)試項(xiàng)目 {description.ApiVersion}", //當(dāng)前版本 Version = description.ApiVersion.ToString(), //文檔說(shuō)明 Description = "api項(xiàng)目 當(dāng)前環(huán)境-" + EnvironmentName, //聯(lián)系方式 Contact = new OpenApiContact() { Name = "標(biāo)題", Email = "", Url = null }, TermsOfService = new Uri(""), //許可證 License = new OpenApiLicense() { Name = "文檔", Url = new Uri("") } }; //當(dāng)有棄用標(biāo)記時(shí)的提示信息 if (description.IsDeprecated) { info.Description += " - 此版本已放棄兼容"; } return info; }
3、在Configure中添加
IApiVersionDescriptionProvider:用于枚舉定義的API版本的API版本描述符提供程序
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApiVersionDescriptionProvider provider)
//添加Swagger中間件,主要用于攔截swagger.json請(qǐng)求,從而可以獲取返回所需的接口架構(gòu)信息 app.UseSwagger(opt => { //路由模板,默認(rèn)值是/swagger/{documentName}/swagger.json,這個(gè)屬性很重要!而且這個(gè)屬性中必須包含{documentName}參數(shù)。 //opt.RouteTemplate= "/swagger/{documentName}/swagger.json"; // 表示按Swagger2.0格式序列化生成swagger.json,這個(gè)不推薦使用,盡可能的使用新版本的就可以了 //opt.SerializeAsV2 }); //添加SwaggerUI中間件,主要用于攔截swagger / index.html頁(yè)面請(qǐng)求,返回頁(yè)面給前端 app.UseSwaggerUI(options => { // 為每個(gè)版本創(chuàng)建一個(gè)JSON foreach (var description in provider.ApiVersionDescriptions) { //這個(gè)屬性是往SwaggerUI頁(yè)面head標(biāo)簽中添加我們自己的代碼,比如引入一些樣式文件,或者執(zhí)行自己的一些腳本代碼 //options.HeadContent += $"<script type='text/javascript'>alert('歡迎來(lái)到SwaggerUI頁(yè)面')</script>"; //展示默認(rèn)頭部顯示的下拉版本信息 //options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant()); //自由指定頭部顯示的下拉版本內(nèi)容 options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", "coreApi" + description.ApiVersion); //如果是為空 訪問(wèn)路徑就為 根域名/index.html,注意localhost:8001/swagger是訪問(wèn)不到的 //options.RoutePrefix = string.Empty; // 如果你想換一個(gè)路徑,直接寫(xiě)名字即可,比如直接寫(xiě)c.RoutePrefix = "swagger"; 則訪問(wèn)路徑為 根域名/swagger/index.html options.RoutePrefix = "swagger"; } });
4、在api的Controller中添加版本
[ApiVersion("1.0", Deprecated = false)] //Deprecated是否棄用該版本 默認(rèn)為false不棄用。即使標(biāo)記了棄用此接口還是會(huì)顯示,只是做個(gè)提示此版本將會(huì)被棄用了。 [Route("api/[controller]")] [ApiController] //[ApiExplorerSettings(IgnoreApi = true)] 隱藏該接口Controller public class ValuesController : Controller [Obsolete] //棄用該Action方法 [ApiExplorerSettings(IgnoreApi = true)] //隱藏該Action方法 public IEnumerable<string> Get()
為體驗(yàn)版本控制在新建一個(gè)控制器并添加 [ApiVersion("2.0")]
此時(shí)訪問(wèn)頁(yè)面,在右側(cè)的下拉框中可選擇不同的版本,會(huì)展示不同版本下的控制器。
才疏學(xué)淺,相關(guān)文檔等僅供自我總結(jié),如有相關(guān)問(wèn)題可留言交流謝謝。
原文地址:https://www.cnblogs.com/mzflog/p/14969620.html
世界再大也有盡頭!
原文鏈接:https://www.cnblogs.com/shijiehaiyang/p/15751845.html
相關(guān)推薦
- 2022-05-25 Flutter實(shí)現(xiàn)掃二維碼功能_Android
- 2022-05-09 Python學(xué)習(xí)之面向?qū)ο缶幊淘斀鈅python
- 2022-04-23 .NET?Core使用APB?vNext框架入門(mén)教程_實(shí)用技巧
- 2022-09-03 Python?Pandas多種添加行列數(shù)據(jù)方法總結(jié)_python
- 2022-06-22 一文搞懂C++多態(tài)的用法_C 語(yǔ)言
- 2022-11-07 如何使用python生成大量數(shù)據(jù)寫(xiě)入es數(shù)據(jù)庫(kù)并查詢操作_python
- 2023-12-08 antd 表單校驗(yàn)問(wèn)題
- 2022-06-26 Android開(kāi)發(fā)快速實(shí)現(xiàn)底部導(dǎo)航欄示例_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支