如何在 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 谷歌浏览器的一般使…

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…

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;但它的不同之处是可…

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

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

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;而不是记录事…

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

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

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

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

抢先看:笔者亲历的2020年中国.NET开发者大会活动纪实

编者&#xff1a;2020年中国.NET开发者大会第一天活动已经结束&#xff0c;可以通过https://codechina.csdn.net/lives 会看。第二天的Workshop 也有直播哦。12020年12月19日的苏州工业园区&#xff0c;天公作美&#xff0c;阳光明媚&#xff0c;气象迷人&#xff0c;正是一个搞…

python魔术方法由谁定义_Python的魔术方法

魔术方法就是在定义的类中定义一些”不一般”的方法&#xff0c;使类的使用更方便、完善、健壮&#xff0c;是python特有的方法&#xff0c;一般都是前后包含两个下划线__的方法称为魔术方法&#xff0c;例如__new__。基本魔术方法有哪些__new__&#xff1a;是在一个对象实例化…

Swagger在header中添加token

概述平常做项目使用mvcwebapi&#xff0c;采取前后端分离的方式&#xff0c;后台提供API接口给前端开发人员。这个过程中遇到一个问题后台开发人员怎么提供接口说明文档给前端开发人员。为了解决这个问题&#xff0c;项目中引用swagger&#xff08;我比较喜欢戏称为“丝袜哥”&…

如何在 C# 中使用 数据注解

数据注解 是一种可以应用到 类 或者 类成员上用来指定类之间关系的一种 Attribute&#xff0c;它的应用场景比较多&#xff0c;可用来描述 UI 上如何进行数据展示&#xff0c;还可以用来做类属性的规则验证&#xff0c;这篇文章就来讨论为什么 注解 值得你去学习&#xff0c;以…

2020年中国.NET开发者大会第二天 WorkShop

工作坊1&#xff1a;使用 NCF 从 0 到 1 快速模块化开发/部署业务系统实战工作坊简介&#xff1a;本次工作坊由盛派开发团队亲自带领开发者使用 NCF&#xff08;NeuCharFramework&#xff09; 框架进行系统快速开发&#xff0c;进行现场实操训练&#xff0c;大家可以通过本次活…

mysql直接生成excel_MYSQL 将excel里面的数据直接生成sql语句

如何使用EXCEL生成SQL语句&#xff1f;将光标放到新的列上里面&#xff0c;然后在公式栏里面输入如下公式&#xff1a;"insert into t values("&A1&","&B1&","&C1&","&D1&")"效果图&#x…

OrchardCore实现模块化核心原理分析

【导读】ABP vNext并未过多探究&#xff0c;当然其基于DDD理念分层清晰&#xff0c;灵活性、扩展性自然也不在话下&#xff0c;但有些情况下我可能会首选OrchardCore&#xff0c;并非ABP vNext不可若改造项目&#xff0c;也因历史遗留问题&#xff0c;数据库表设计也可能存在不…