Asp.Net Core SwaggerUI 接入
簡單了解
swagger
的目的簡單來說就是,不用為每個接口手動寫接口文檔,因為它是根據接口自動生成的,接口更改時文檔也同步更新,減少了手動更新的麻煩和遺漏。同時也提供了接口的調試等功能,你不用打開postman
等接口測試軟件來測試接口;如果有寫備注的話,接口、入參和輸出都有詳細的備注說明,調用接口的人也能更加直觀的讀懂接口。溝通效率和工作效率也會大大提升。
Swagger接入的步驟:
- 注冊
Swagger
生成器:services.AddSwaggerGen()
. - 插入中間件,將生成的
Swagger
公開為JSON
節點:app.UseSwagger()
- 插入
Swagger-UI
中間件,將指定的swagger json
端點為其提供支持:app.UseSwaggerUI()
一、添加Nuget包
Package Manager : Install-Package Swashbuckle.AspNetCore
或
CLI : dotnet add package Swashbuckle.AspNetCore
二、注冊swagger文檔服務
-
注意
-
如果mvc使用的是
services.AddMvcCore()
,則需要手動添加ApiExplorer
,因為SwashBuckle
強烈依賴於ApiExplorer
,ApiExplorer
用來發現控制器中的接口方法。需要手動添加。如:
services.AddMvcCore().AddApiExplorer();
-
如果使用的是
services.AddMvc()
,則不需要再進行注冊。因為AddMvc()
中已經添加了ApiExplorer
。如:public static IMvcBuilder AddMvc(this IServiceCollection services) { if (services == null) throw new ArgumentNullException(nameof (services)); IMvcCoreBuilder builder = services.AddMvcCore(); builder.AddApiExplorer();//在這里 builder.AddAuthorization(); MvcServiceCollectionExtensions.AddDefaultFrameworkParts(builder.PartManager); builder.AddFormatterMappings(); builder.AddViews(); builder.AddRazorViewEngine(); builder.AddRazorPages(); builder.AddCacheTagHelper(); builder.AddDataAnnotations(); builder.AddJsonFormatters(); builder.AddCors(); return (IMvcBuilder) new MvcBuilder(builder.Services, builder.PartManager); }
-
什么時候用
AddMvc()
,什么時候用AddMvcCore()
呢?
通過AddMvc()
的方法中我們應該可以發現,里面有添加View
、Razor
和TagHelper
服務,這些在WebApi項目中是用不到的。所以:
1).如果你的項目是mvc web程序,則使用AddMvc()
.
2).如果的項目是webapi,則使用AddMvcCore()
,然后酌情添加需要的其它服務;當然使用AddMvc()
也沒有問題。
-
添加Swagger服務
services.AddSwaggerGen(options =>
{
options.SwaggerDoc(AppDefaults.ApiDocumentName, new Info
{
Title = AppDefaults.ApiDocumentTitle,
Description = AppDefaults.ApiDocumentDescription,
Version = typeof(Startup).Assembly.GetName().Version.ToString()
});
//加載注釋文件
Directory.GetFiles(Environment.ContentRootPath, "*.xml", SearchOption.AllDirectories)
.ToList()
.ForEach(f => options.IncludeXmlComments(f));
});
三、添加管道
//生成swagger-json文件,並重定義swagger-json文件路由模板,這里我修改了 swagger-json 的路由模板。
//如果不自定義的話,默認是 swagger/{documentName}/swagger.json
app.UseSwagger(options => options.RouteTemplate = "{documentName}/swagger.json");
app.UseSwaggerUI(options =>
{
//指定生成swagger-json文件路徑,為SwaggerUI提供數據。
//如果上邊路由模板沒有自定義,則完成路徑是 /swagger/{AppDefaults.ApiDocumentName}/swagger.json
options.SwaggerEndpoint($"/{AppDefaults.ApiDocumentName}/swagger.json", AppDefaults.ApiDocumentName);
//自定義SwaggerUI頁面路由前綴
//地址欄輸入 http://loacalhost:5000/lxp 就可以打開SwaggerUI頁面
options.RoutePrefix = "lxp";
});
四、定義接口
- 如果想要控制器在
Swagger
中顯示,所有控制器必須使用屬性路由 - 接口方法要使用 Http 屬性和 From 特性標注
例如:
[Route("[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[HttpGet("name")]
public async Task<ActionResult<string>> GetNameAsync([FromQuery] string name)
{
if (!string.IsNullOrEmpty(name))
{
ModelState.TryAddModelError(nameof(name), $"{nameof(name)} can not be empty");
}
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
return await Task.FromResult(name);
}
}
補充:
AppDefaults
是我定義一個常量的類