如何在 ASP.NET Core 中使用 API 分析器

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<Author> authors = new List<Author>(){new Author{Id = 1,FirstName = "Joydip",LastName = "Kanjilal"},new Author{Id = 2,FirstName = "Steve",LastName = "Smith"}};public async Task<Author> GetAuthor(int id){           var author = authors.FirstOrDefault(a => a.Id == id);return await Task.FromResult<Author>(author);}public async Task<bool> 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<ActionResult<Author>> 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<ActionResult<bool>> 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 端点地址

现在把程序跑起来,输入地址:http://localhost:51787/swagger/index.html, 你会看到如下 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<ActionResult<Author>> 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<ActionResult<Author>> 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<ActionResult<bool>> 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:  https://github.com/domaindrivendev/Swashbuckle.AspNetCore

译文链接:https://www.infoworld.com/article/3567194/how-to-use-api-analyzers-in-asp-net-core.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net mysql字符串截取_【MySQL】字符串截取之SUBSTRING_INDEX和【MySQL】字符串四则运算...

substring_index(str,delim,count)str:要处理的字符串delim:分隔符count:计数例子&#xff1a;strwww.google.com1.count是正数&#xff0c;那么就是从左往右数&#xff0c;第N个分隔符的左边的全部内容SELECT SUBSTRING_INDEX(www.google.com,.,1);结果是&#xff1a;wwwSELEC…

用C#+Selenium+ChromeDriver 爬取网页,完美模拟真实的用户浏览行为

背景Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。而对于爬虫来说&#xff0c;使用Selenium操控浏览器来爬取网上的数据那么肯定是爬虫中的杀手武器。这里&#xff0c;我将介绍selenium 谷歌浏览器的一般使…

mysql 设置宽松模式_mysql5.6 sql_mode设置为宽松模式

最近遇到一个很奇怪的事情由于数据人员的需求&#xff0c;现在需要修改mysql的sql_modesql_mode默认是sql_modeNO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES这时候我在/etc/my.cnf配置如下sql_modeNO_ENGINE_SUBSTITUTION重启后还是mysql> SELECT GLOBAL.sql_mode;---------…

ASP.NET Core ActionFilter引发的一个EF异常

最近在使用ASP.NET Core的时候出现了一个奇怪的问题。在一个Controller上使用了一个ActionFilter之后经常出现EF报错。InvalidOperationException: A second operation started on this context before a previous operation completed. Any instance members are not guarante…

mysql os.pid_MySQL在OS El Capitan的配置[PID file error]

Installation使用Homebrew安装&#xff1a;brew install mysqlbash中显示如下信息&#xff0c;安装成功。Weve installed your MySQL database without a root password. To secure it run:mysql_secure_installationTo connect run:mysql -urootTo have launchd start mysql n…

BCVP开发者说第5期:QuartzCore.Blazor

沉静岁月&#xff0c;淡忘流年1项目简介QuartzCore.BlazorQuartzCore.Blazor 是一个基于 .Net5 开发的轻量级 Quartz 作业配置中心&#xff0c;实践应用 Ant Design Blazor 和 FreeSql 两个技术&#xff0c; 对这两个技术感兴趣的小伙伴可以加我一起学习讨论哦&#xff0c;对有…

mysql update返回_MySQL中,当update修改数据与原数据相同时会再次执行吗?

本文同步Java知音社区&#xff0c;专注于Java作者&#xff1a;powdbahttps://yq.aliyun.com/articles/694162一、背景本文主要测试MySQL执行update语句时&#xff0c;针对与原数据&#xff08;即未修改&#xff09;相同的update语句会在MySQL内部重新执行吗&#xff1f;二、测试…

.NET 云原生架构师训练营(模块二 基础巩固 日志)--学习笔记

2.2.2 核心模块--日志ILogger 的使用日志的 ID日志的分类日志的级别LoggerProvider日志的最佳实践.NET Core 和 ASP.NET Core 中的日志记录&#xff1a;https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/logging/?viewaspnetcore-5.0ILogger 的使用在 Get 方法中添…

mysql数据库设计三大范式_了解数据库设计三大范式

数据库设计范式什么是范式&#xff1a;简言之就是&#xff0c;数据库设计对数据的存储性能&#xff0c;还有开发人员对数据的操作都有莫大的关系。所以建立科学的&#xff0c;规范的的数据库是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范…

使用BeetleX网关部署第三方Web服务

BeetleX的http/ws网关在早期版本可以启动和管理第三方Web服务进程&#xff0c;在最新的1.5版本中引入了文件管理功能&#xff0c;通过这一功能可以对第三方Web服务进行发布管理。加入文件管理后BeetleX的新版本网关服务可以理解为一个简单化的IIS&#xff0c;但它的不同之处是可…

mysql 错误 0152_SP2-1503 SP2-0152 错误解决

一、现场描述服务器上有Oracle 10g环境变量分别为Oracle 10g环境变量export ORACLE_BASE/opt/oracleexport ORACLE_HOME$ORACLE_BASE/product/10.2.0/db_1export ORACLE_PATH$ORACLE_BASE/common/oracle/sql:.:$ORACLE_HOME/rdbms/adminexport ORACLE_SIDecpexport NLS_LANGAME…

2020.NET开发者大会大会线上同步直播,以及参会秘籍

2020.NET开发者大会马上就要开幕啦&#xff01;你都做好参会准备没有&#xff1f;本届峰会线上分享将在思否和CSDN两个媒体平台同步进行&#xff0c;大家可以选择适合自己的方式在线参与互动哦&#xff01;访问下方链接&#xff0c;可以直接加入直播&#xff1a;思否直播观看地…

mysql数据聚合技术_Mysql 去重 聚合

示例数据表中的数据&#xff1a;mysql> select * from talk_test;-------------------| id | name | mobile |-------------------| 1 | xiao9 | 555555 || 2 | xiao6 | 666666 || 3 | xiao9 | 888888 || 4 | xiao9 | 555555 || 5 | xiao6 | 777777 |----------------…

C# 9.0中引入的新特性init和record的使用思考

.NET 5.0已经发布&#xff0c;C# 9.0也为我们带来了许多新特性&#xff0c;其中最让我印象深刻的就是init和record type&#xff0c;很多文章已经把这两个新特性讨论的差不多了&#xff0c;本文不再详细讨论&#xff0c;而是通过使用角度来思考这两个特性。initinit是C# 9.0中引…

使用 .NET Core 中的 EventCounters 衡量性能

背景对于每隔几毫秒发生的事件&#xff0c;最好使每个事件的开销较低&#xff08;小于一毫秒&#xff09;。 否则&#xff0c;对性能的影响将很大。 记录事件意味着你将向磁盘写入内容。 如果磁盘不够快&#xff0c;你将丢失事件。 你需要一个解决方案&#xff0c;而不是记录事…

mysql100链接同时处理_php 连接MYSQL 两个同时连接为什么只有一个连接成功,必须删掉一个,另外一个才查询生效出结果,下附代码...

include("config.php");header("Content-Type:text/html;charsetgbk_2312");$connmysql_connect($config_ip,$config_name,$config_pass)ordie("链接错误");mysql_select_db($config...include("config.php");header("Content-Ty…

python 3.9特性_Python 3.9来了!这十个新特性值得关注

选自towardsdatascience作者&#xff1a;Farhad Malik机器之心编译编辑&#xff1a;陈萍近日&#xff0c;Python 3.9 发布&#xff0c;并开发了一些新特性&#xff0c;包括字典合并与更新、新的解析器、新的字符串函数等。Python 3.9 已于 10 月 5 日发布&#xff0c;新版本的特…

基于 C# 的 ETL 大数据并行编程

作者&#xff1a;James Spinella译者&#xff1a;精致码农原文&#xff1a;https://bit.ly/3nGQu4J并行编程在历史上一直是软件开发中比较小众和复杂的环节&#xff0c;往往不值得头疼。但编写并行化应用只会越来越简单&#xff0c;一个应用同时利用设备 CPU 上的多个内核&…

python购物车典例_Python入门:购物车实例

product_list[(iphone,5800),(pro,120000),(python book,120),(Bike,800),(coffe,39)] #定义商品列表shopping_list[] #定义购物车salaryinput("your sally:") #输入薪水if salary.isdigit(): #判断是否为数字salaryint(salary)while True:for index,item in enumera…

一个小技巧助您减少if语句的状态判断

在进行项目的开发的过程中&#xff0c; if 语句是少不了的&#xff0c;但我们始终要有一颗消灭 if / else 语句的心。为了消灭if / else 我们引入了 短路器 的概念。短路器 有时候的确能精简我们的代码&#xff0c;但还不够&#xff0c;因此我参考了一个方法来继续消灭一部分 断…