如何在 ASP.NET Core 中使用 API Analyzer
ASP.NET Core 2.2 引入了 API 分析器,它有利於提高 API 的文件化,API分析器 可以應用在任何帶有 ApiController
特性的 Controller 上,本篇就和大家一起討論下。
安裝 API 分析器
如果你使用的是 ASP.NET Core 2.2 的話,用 Visual Studio 中的 NuGet Package Manager
視覺化皮膚 或者 NuGet Package Manager Console
命令列輸入如下命令安裝 Api Analyzer。
Install-Package Microsoft.AspNetCore.Mvc.Api.Analyzers
值得注意的是,在 ASP.NET Core 3.0 中已經內建了 Microsoft.AspNetCore.Mvc.Api.Analyzers,所以不需要單獨安裝。
建立 model 和 repository
生成一個 Author 類,程式碼如下:
public class Author
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
為了簡單起見,我準備建立一個非常簡單的 Repository,不連線資料庫,如下程式碼所示:
public class AuthorRepository
{
List authors = new List()
{
new Author
{
Id = 1,
FirstName = "Joydip",
LastName = "Kanjilal"
},
new Author
{
Id = 2,
FirstName = "Steve",
LastName = "Smith"
}
};
public async Task GetAuthor(int id)
{
var author = authors.FirstOrDefault(a => a.Id == id);
return await Task.FromResult(author);
}
public async Task SaveAuthor(Author author)
{
var result = authors.Where(a => a.Id == author.Id);
if(result == null)
{
authors.Add(author);
return await Task.FromResult(true);
}
return await Task.FromResult(false);
}
}
上面 AuthorRepository 類包含兩個方法: GetAuthor()
和 SaveAuthor()
,前者用於在集合中返回 author 例項,後者用於將 author 例項插入到集合中。
建立 controller 類
接下來將 DefaultController 改造如下:
[Route("api/[controller]")]
[ApiController]
public class DefaultController : ControllerBase
{
AuthorRepository authorRepository = new AuthorRepository();
[HttpGet("{id}")]
public async Task> Get(int id)
{
if (id <= 0)
{
return BadRequest();
}
try
{
var author = await authorRepository.GetAuthor(id);
if (author == null)
return NotFound();
return Ok(author);
}
catch
{
return BadRequest();
}
}
[HttpPut]
public async Task> Put([FromBody] Author author)
{
var result = await authorRepository.GetAuthor(author.Id);
if (result == null)
return NotFound();
if (author == null)
{
return BadRequest();
}
try
{
var success = await authorRepository.SaveAuthor(author);
if (!success)
return BadRequest();
return Ok(author);
}
catch
{
return BadRequest();
}
}
}
配置 Swagger
然後透過 Nuget 將 Swashbuckle.AspNetCore 引入到專案,從而讓 API 文件化。
Install-Package Swashbuckle.AspNetCore
當 Swashbuckle.AspNetCore 安裝完畢之後,在 Startup.ConfigureServices 方法中將 Swagger 注入到 IOC 容器中,程式碼如下:
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "ApiAnalyzersDemo API",
Version = "v1"});
});
AddSwaggerGen 擴充套件方法主要是用來指定 API 文件的後設資料,通常情況下還要啟動 Swagger UI 來實現視覺化,在 Startup.Configure
方法中增加如下程式碼。
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
});
瀏覽 Swagger UI 端點地址
現在把程式跑起來,輸入地址:, 你會看到如下 API 文件化介面。
值得注意的是,Swagger 預設只會列出 HttpStatus =200 的 Response 資訊,如下圖:
如果想讓 Swagger 多列幾種狀態,要怎麼做呢?你可以在 Action 或者 Controller 上增加幾個 StatusCode 狀態即可,比如 200,400 和 404 ,修改程式碼如下:
[Route("api/[controller]")]
[ApiController]
[ApiConventionType(typeof(DefaultApiConventions))]
public class DefaultController : ControllerBase
{
AuthorRepository authorRepository = new AuthorRepository();
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task> Get(int id)
{
if (id <= 0)
{
return BadRequest();
}
try
{
var author = await authorRepository.GetAuthor(id);
if (author == null)
return NotFound();
return Ok(author);
}
catch
{
return BadRequest();
}
}
}
然後再次執行應用程式看下頁面輸出。
完整的 分析器 程式碼
下面是完整的 DefaultController 程式碼,可供參考。
[Route("api/[controller]")]
[ApiController]
[ApiConventionType(typeof(DefaultApiConventions))]
public class DefaultController : ControllerBase
{
AuthorRepository authorRepository = new AuthorRepository();
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task> Get(int id)
{
if (id <= 0)
{
return BadRequest();
}
try
{
var author = await authorRepository.GetAuthor(id);
if (author == null)
return NotFound();
return Ok(author);
}
catch
{
return BadRequest();
}
}
[HttpPut]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task> Put([FromBody] Author author)
{
var result = await authorRepository.GetAuthor(author.Id);
if (result == null)
return NotFound();
if (author == null)
{
return BadRequest();
}
try
{
var success = await authorRepository.SaveAuthor(author);
if (!success)
return BadRequest();
return Ok(author);
}
catch
{
return BadRequest();
}
}
}
API 分析器 是 ASP.NET Core 的一個非常好的補充,正如我們看到的,你可以利用 API Analyzers 和 Swashbuckle 來生成一個優美的 API 文件,關於 Swashbuckle 更多的知識,參考 github: github.com/domaindrivendev/Swashbuckle.AspNetCore
更多高質量乾貨:參見我的 GitHub: [csharptranslate] github.com/ctripxchuang/csharptranslate
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4369/viewspace-2826903/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何在ASP.NET Core 中使用IHttpClientFactoryASP.NETHTTPclient
- 如何在 ASP.Net Core 中使用 LamarASP.NET
- 如何在 ASP.Net Core 中使用 SerilogASP.NET
- ASP.NET Core Web API中使用SwaggerASP.NETWebAPISwagger
- 使用 ASP.NET Core 和 MongoDB 建立 Web APIASP.NETMongoDBWebAPI
- 如何在 ASP.NET Core 5 中過載 Action 方法ASP.NET
- 如何在 ASP.Net Core 中實現 健康檢查ASP.NET
- 從 MVC 到使用 ASP.NET Core 6.0 的最小 APIMVCASP.NETAPI
- ASP.NET Core Web API 索引 (更新Redis in .NET Core)ASP.NETWebAPI索引Redis
- 測試 ASP.NET Core API ControllerASP.NETAPIController
- ASP.NET Core Web API 與 SSLASP.NETWebAPI
- ASP.NET Core Web API 介面限流ASP.NETWebAPI
- ASP.NET Core Web API 整合測試中使用 Bearer TokenASP.NETWebAPI
- ASP.NET Core ----ASP.NET Core中使用Code FirstASP.NET
- 如何在ASP.NET Core中編寫高效的控制器ASP.NET
- 如何在 ASP.NET Core 中寫出更乾淨的 ControllerASP.NETController
- ASP.NET Core Web API 整合測試ASP.NETWebAPI
- ASP.NET Core Web Api之JWT(一)ASP.NETWebAPIJWT
- ASP.NET Core Web API 教程 - Project ConfigurationASP.NETWebAPIProject
- ASP.NET Core 實戰:使用 ASP.NET Core Web API 和 Vue.js,搭建前後端分離框架ASP.NETWebAPIVue.js後端框架
- ASP.NET Core 3.x API版本控制ASP.NETAPI
- Asp.Net Core 統一Api返回值ASP.NETAPI
- jwt-在asp.net core中的使用jwtJWTASP.NET
- 在ASP.NET Core中用HttpClient(六)——ASP.NET Core中使用HttpClientFactoryASP.NETHTTPclient
- ASP.NET Core 中使用TypeScriptASP.NETTypeScript
- Asp.Net Core 3.1 學習4、Web Api 中基於JWT的token驗證及Swagger使用ASP.NETWebAPIJWTSwagger
- Api閘道器Kong整合Consul做服務發現及在Asp.Net Core中的使用APIASP.NET
- ASP.NET Core Web API 流式返回,逐字顯示ASP.NETWebAPI
- ASP.NET Core微服務如何在雲環境中跨平臺服務?ASP.NET微服務
- ASP.Net Core5.0 EF Core使用記錄ASP.NET
- 使用 dynamic 型別讓 ASP.NET Core 實現 HATEOAS 結構的 RESTful API型別ASP.NETRESTAPI
- 【asp.net core 系列】14 .net core 中的IOCASP.NET
- 如何在ASP.NET Core中避免JSON序列化的迴圈引用(連結)ASP.NETJSON
- 【ASP.NET Core】在 Mini-API 中注入服務ASP.NETAPI
- 【ASP.NET Core】體驗一下 Mini Web APIASP.NETWebAPI
- 在ASP.NET Core中使用ViewComponentASP.NETView
- ASP.NET Core使用EF Core操作MySql資料庫ASP.NETMySql資料庫
- ASP.NET Core 中的快取ASP.NET快取