ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

引言

在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者的心情。或者详细点,或者简单点。那么有没有一种快速有效的方法来构建api说明文档呢?答案是肯定的, Swagger就是最受欢迎的REST APIs文档生成工具之一!

为什么使用Swagger作为REST APIs文档生成工具

  1. Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学习和尝试API。

  2. Swagger 可以生成客户端SDK代码用于各种不同的平台上的实现。

  3. Swagger 文件可以在许多不同的平台上从代码注释中自动生成。

  4. Swagger 有一个强大的社区,里面有许多强悍的贡献者。

asp.net core中如何使用Swagger生成api说明文档呢

  1. Swashbuckle.AspNetCore 是一个开源项目,用于生成 ASP.NET Core Web API 的 Swagger 文档。

  2. NSwag 是另一个用于将 Swagger UI 或 ReDoc 集成到 ASP.NET Core Web API 中的开源项目。 它提供了为 API 生成 C# 和 TypeScript 客户端代码的方法。

下面以Swashbuckle.AspNetCore为例为大家进行展示

Swashbuckle由哪些组成部分呢?

  • Swashbuckle.AspNetCore.Swagger:将 SwaggerDocument 对象公开为 JSON 终结点的 Swagger 对象模型和中间件。

  • Swashbuckle.AspNetCore.SwaggerGen:从路由、控制器和模型直接生成 SwaggerDocument 对象的 Swagger 生成器。 它通常与 Swagger 终结点中间件结合,以自动公开 Swagger JSON。

  • Swashbuckle.AspNetCore.SwaggerUI:Swagger UI 工具的嵌入式版本。 它解释 Swagger JSON 以构建描述 Web API 功能的可自定义的丰富体验。 它包括针对公共方法的内置测试工具。

如何使用vs2017安装Swashbuckle呢?

  • 从“程序包管理器控制台”窗口进行安装

  • 转到“视图” > “其他窗口” > “程序包管理器控制台”

  • 导航到包含 TodoApi.csproj 文件的目录

  • 请执行以下命令 ·Install-Package Swashbuckle.AspNetCore

  • 640?wx_fmt=png

  • 从“管理 NuGet 程序包”对话框中:

  • 右键单击“解决方案资源管理器” > “管理 NuGet 包”中的项目

  • 将“包源”设置为“nuget.org”

  • 在搜索框中输入“Swashbuckle.AspNetCore”

  • 从“浏览”选项卡中选择“Swashbuckle.AspNetCore”包,然后单击“安装”

  • 640?wx_fmt=png

添加并配置 Swagger 中间件

首先引入命名空间:

using Swashbuckle.AspNetCore.Swagger;

将 Swagger 生成器添加到 Startup.ConfigureServices 方法中的服务集合中:

//注册Swagger生成器,定义一个和多个Swagger 文档services.AddSwaggerGen(c =>
{     c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
});

在 Startup.Configure 方法中,启用中间件为生成的 JSON 文档和 Swagger UI 提供服务:

//启用中间件服务生成Swagger作为JSON终结点app.UseSwagger();//启用中间件服务对swagger-ui,指定Swagger JSON终结点app.UseSwaggerUI(c =>
{    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});

启动应用,并导航到 http://localhost:<port>/swagger/v1/swagger.json。 生成的描述终结点的文档显示如下json格式。

640?wx_fmt=png

可在 http://localhost:<port>/swagger 找到 Swagger UI。 通过 Swagger UI 浏览 API文档,如下所示。

640?wx_fmt=png

要在应用的根 (http://localhost:<port>/) 处提供 Swagger UI,请将 RoutePrefix 属性设置为空字符串:

app.UseSwaggerUI(c =>
{    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");    c.RoutePrefix = string.Empty;
});

Swagger的高级用法(自定义以及扩展)

使用Swagger为API文档增加说明信息

在 AddSwaggerGen 方法的进行如下的配置操作会添加诸如作者、许可证和说明信息等:

//注册Swagger生成器,定义一个和多个Swagger 文档services.AddSwaggerGen(c =>
{c.SwaggerDoc("v1", new Info{Version = "v1",Title = "yilezhu's API",Description = "A simple example ASP.NET Core Web API",TermsOfService = "None",Contact = new Contact{Name = "依乐祝",Email = string.Empty,Url = "http://www.cnblogs.com/yilezhu/"},License = new License{Name = "许可证名字",Url = "http://www.cnblogs.com/yilezhu/"}});
});

wagger UI 显示版本的信息如下图所示:

640?wx_fmt=png

为了防止博客被转载后,不保留本文的链接,特意在此加入本文的链接:https://www.cnblogs.com/yilezhu/p/9241261.html

为接口方法添加注释

大家先点击下api,展开如下图所示,可以没有注释啊,怎么来添加注释呢?

640?wx_fmt=png

按照下图所示用三个/添加文档注释,如下所示

/// <summary>
/// 这是一个api方法的注释
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult<IEnumerable<string>> Get() {  
  return new string[] { "value1", "value2" }; }

然后运行项目,回到swaggerUI中去查看注释是否出现了呢

640?wx_fmt=png

还是没有出现,别急,往下看!

启用XML 注释

可使用以下方法启用 XML 注释:

  • 右键单击“解决方案资源管理器”中的项目,然后选择“属性”

  • 查看“生成”选项卡的“输出”部分下的“XML 文档文件”框

  • 640?wx_fmt=png

启用 XML 注释后会为未记录的公共类型和成员提供调试信息。如果出现很多警告信息  例如,以下消息指示违反警告代码 1591:

warning CS1591: Missing XML comment for publicly visible type or member 'TodoController.GetAll()'

如果你有强迫症,想取消警告怎么办呢?可以按照下图所示进行取消

640?wx_fmt=png

注意上面生成的xml文档文件的路径,

 注意:

1.对于 Linux 或非 Windows 操作系统,文件名和路径区分大小写。 例如,“SwaggerDemo.xml”文件在 Windows 上有效,但在 CentOS 上无效。

2.获取应用程序路径,建议采用Path.GetDirectoryName(typeof(Program).Assembly.Location)这种方式或者·AppContext.BaseDirectory这样来获取

//注册Swagger生成器,定义一个和多个Swagger 文档services.AddSwaggerGen(c =>{c.SwaggerDoc("v1", new Info{Version = "v1",Title = "yilezhu's API",Description = "A simple example ASP.NET Core Web API",TermsOfService = "None",Contact = new Contact{Name = "依乐祝",Email = string.Empty,Url = "http://www.cnblogs.com/yilezhu/"},License = new License{Name = "许可证名字",Url = "http://www.cnblogs.com/yilezhu/"}});                // 为 Swagger JSON and UI设置xml文档注释路径var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);//获取应用程序所在目录(绝对,不受工作目录影响,建议采用此方法获取路径)var xmlPath = Path.Combine(basePath, "SwaggerDemo.xml");c.IncludeXmlComments(xmlPath);});

重新生成并运行项目查看一下注释出现了没有

640?wx_fmt=png

通过上面的操作可以总结出,Swagger UI 显示上述注释代码的 <summary> 元素的内部文本作为api大的注释!

当然你还可以将 remarks 元素添加到 Get 操作方法文档。 它可以补充 <summary> 元素中指定的信息,并提供更可靠的 Swagger UI。 <remarks> 元素内容可包含文本、JSON 或 XML。 代码如下:

 /// <summary>/// 这是一个带参数的get请求/// </summary>/// <remarks>/// 例子:/// Get api/Values/1/// </remarks>/// <param name="id">主键</param>/// <returns>测试字符串</returns>          [HttpGet("{id}")] public ActionResult<string> Get(int id) {       return $"你请求的 id 是 {id}";}

重新生成下项目,当好到SwaggerUI看到如下所示:

640?wx_fmt=png

描述响应类型

摘录自:https://www.cnblogs.com/yanbigfeg/p/9232844.html

接口使用者最关心的就是接口的返回内容和响应类型啦。下面展示一下201和400状态码的一个简单例子:

我们需要在我们的方法上添加:[ProducesResponseType(201)][ProducesResponseType(400)]

然后添加相应的状态说明:

最终代码应该是这个样子:

 /// <summary>/// 这是一个带参数的get请求/// </summary>/// <remarks>/// 例子:/// Get api/Values/1/// </remarks>/// <param name="id">主键</param>/// <returns>测试字符串</returns> /// <response code="201">返回value字符串</response>/// <response code="400">如果id为空</response>  // GET api/values/2
[HttpGet("{id}")] [ProducesResponseType(201)] [ProducesResponseType(400)]
public ActionResult<string> Get(int id){  
   return $"你请求的 id 是 {id}"; }

效果如下所示
640?wx_fmt=png

使用SwaggerUI测试api接口

下面我们通过一个小例子通过SwaggerUI调试下接口吧

  1. 点击一个需要测试的API接口,然后点击Parameters左右边的“Try it out ” 按钮

  2. 在出现的参数文本框中输入参数,如下图所示的,输入参数2

  3. 点击执行按钮,会出现下面所示的格式化后的Response,如下图所示

640?wx_fmt=png

好了,今天的在ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了的教程就到这里了。希望能够对大家学习在ASP.NET Core中使用Swagger生成api文档有所帮助!

总结

本文从手工书写api文档的痛处说起,进而引出Swagger这款自动生成api说明文档的工具!然后通过通俗易懂的文字结合图片为大家演示了如何在一个ASP.NET Core WebApi中使用SwaggerUI生成api说明文档。最后又为大家介绍了一些ASP.NET Core 中Swagger的一些高级用法!希望对大家在ASP.NET Core中使用Swagger有所帮助!

原文地址:https://www.cnblogs.com/yilezhu/p/9241261.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

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

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

相关文章

.NET Core微服务之基于Exceptionless实现分布式日志记录

一、Exceptionless极简介绍Exceptionless 是一个开源的实时的日志收集框架&#xff0c;它可以应用在基于 ASP.NET&#xff0c;ASP.NET Core&#xff0c;Web API&#xff0c;Web Forms&#xff0c;WPF&#xff0c;Console&#xff0c;ASP.NET MVC 等技术开发的应用程序中&#x…

.netcore 整合 log4net

1.背景前两天&#xff0c;曾经的一个同事咨询我&#xff0c;怎样将log4net以中间件的形式整合到core里边去。我不假思索的回答&#xff0c;这种问题应该有人做过吧&#xff0c;他说没有。于是&#xff0c;我去博客园搜了下&#xff0c;发现还真没有&#xff0c;全部都是传统.NE…

Asp.Net Core中利用Seq组件展示结构化日志功能

在一次.Net Core小项目的开发中&#xff0c;掌握的不够深入&#xff0c;对日志记录并没有好好利用&#xff0c;以至于一出现异常问题&#xff0c;都得跑动服务器上查看&#xff0c;那时一度怀疑自己肯定没学好&#xff0c;不然这一块日志不可能需要自己扒服务器日志来查看&…

Apache SkyWalking的架构设计【译文】

Apache SkyWalking提供了一个功能强大并且很轻量级的后端。在此&#xff0c;将介绍为什么采用以下方式来设计它&#xff0c;以及它又是如何工作的。架构图对于APM而言&#xff0c;agent或SDKs仅是如何使用libs的技术细节。手动或自动的形式与架构无关&#xff0c;因此在本文中&…

通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?

什么是.NET&#xff1f;什么是.NET Framework?本文将从上往下&#xff0c;循序渐进的介绍一系列相关.NET的概念&#xff0c;先从类型系统开始讲起&#xff0c;我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念&#xff0c;这主要包括&#xff1a;CLS、CTS(CLI)、FCL…

.Net Core小技巧 - Hosted Services + Quartz实现定时任务调度

背景之前一直有朋友问&#xff0c;.Net Core Linux环境有没有类似Windows服务的东西。其实是有的&#xff0c;我了解的方法有两种&#xff1a;#1 创建一个ASP.Net Core的Web项目&#xff08;如Web API&#xff09;&#xff0c;然后通过添加中间件&#xff08;Middleware&#…

在.NET Core微服务中使用HostBuilder和Generic Host

基于控制台的服务中探索一个简单模式&#xff0c;以解决跨领域问题。“通用” Host和HostBuilder是随.NET Core 2.1发布而发布的新功能组件的组件。它们的一个用例是通过提供用于添加横切关注点&#xff08;例如依赖注入&#xff0c;配置和日志记录&#xff09;的模式来简化基于…

EntityFramework Core进行读写分离最佳实践方式,了解一下?

本来打算写ASP.NET Core MVC基础系列内容&#xff0c;博客评论有园友提出讲讲读写分离&#xff0c;这个问题提的好。大多数情况下&#xff0c;对于园友在评论中提出的问题&#xff0c;如果是值得深究或者大多数同行比较关注的问题我都会私下去看看&#xff0c;然后进行对应解答…

小X的加法难题

小X的加法难题 题目大意&#xff1a; 一个AB的式子&#xff0c;但之间有一些没用的空格&#xff0c;要你求出结果 原题&#xff1a; 解题思路&#xff1a; 字符输入&#xff0c;有数字就存起来&#xff0c;用加号和换行符来分开 代码&#xff1a; #include<cstdio>…

【桶排】小 X 的密码破译

小 X 的密码破译 题目大意&#xff1a; 有一堆式子&#xff0c;去重再排序后&#xff0c;按规则求出结果 原题&#xff1a; 解题思路&#xff1a; 把每一个求出来的数丢到桶里&#xff0c;然后跑一遍就可以了 代码&#xff1a; #include<cstdio> using namespace s…

Uva12325 Zombie's Treasure Chest [二分区间+模拟退火]

Zombie’s Treasure Chest 题目链接 https://cn.vjudge.net/problem/UVA-12325 题意 两种物品无穷多个,第一种物品重量s1s_1s1​,价值v1v_1v1​,第二种物品重量s2s_2s2​,价值v2v_2v2​,背包重nnn,求能装的最大价值之和. 数据全都是2e92e92e9.也就是两种物品的完全背包. 题…

Identity Server 4 预备知识 -- OpenID Connect 简介

我之前的文章简单的介绍了OAuth 2.0 (在这里: 要用Identity Server 4 -- OAuth 2.0 超级简介, 还不是很全.这篇文章我要介绍一下 OpenID Connect.OAuth 2.0 不是身份认证协议OAuth 2.0 不是身份认证(Authentication)协议. 为什么有人会认为OAuth 2.0具有身份认证的功能? 这是因…

Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

Ocelot作为基于.net core的API网关&#xff0c;有一个功能是统一验证&#xff0c;它的作用是把没有访问权限的请求挡在API网关外面&#xff0c;而不是到达API网关事端的API时才去验证&#xff1b;之前我有一篇博文Ocelot统一权限验证&#xff0c;作过说明&#xff0c;这篇博文说…

【并查集】小 X 的液体混合

小 X 的液体混合 题目大意&#xff1a; 在一个玻璃瓶里&#xff0c;放入一些液体&#xff0c;某一对液体放在一起会有反应&#xff0c;当某个液体有反应时危险度就会乘2&#xff08;初值为1&#xff09;&#xff0c;问危险度最大是多少 原题&#xff1a; 解题思路&#xff1…

Swagger如何访问Ocelot中带权限验证的API

先亮源代码&#xff1a;https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/SwaggerDemo这篇博文不是对asp.net core中使用Swagger作介绍&#xff0c;因为社区博客作了详细说明。今天主要说一下Swagger在Ocelot网关权限验证模式下的访问&a…

etcd-workbench一款免费好用的ETCD客户端,支持SSHTunnel、版本对比等功能

介绍 今天推荐一款完全免费的ETCD客户端&#xff0c;可以私有化部署: etcd-workbench 开源地址&#xff1a;https://github.com/tzfun/etcd-workbench Gitee地址&#xff1a;https://gitee.com/tzfun/etcd-workbench 下载 本地运行 从 官方Release 下载最新版的 jar 包&am…

深度学习中反向传播算法简单推导笔记

反向传播算法简单推导笔记 1.全连接神经网络 该结构的前向传播可以写成: z(1)W(1)xb(1)z^{(1)} W^{(1)}xb^{(1)}z(1)W(1)xb(1) a(1)σ(z(1))a^{(1)} \sigma(z^{(1)})a(1)σ(z(1)) z(2)W(2)a(1)b(2)z^{(2)}W^{(2)}a^{(1)}b^{(2)}z(2)W(2)a(1)b(2) a(2)σ(z(2))a^{(2)} \sigm…

EntityFramework Core进行读写分离最佳实践方式,了解一下(二)?

写过上一篇关于EF Core中读写分离最佳实践方式后&#xff0c;虽然在一定程度上改善了问题&#xff0c;但是在评论中有的指出更换到从数据库。那么接下来要进行插入此时又要切换到主数据库&#xff0c;同时有的指出是否可以进行底层无感知操作&#xff0c;这确实是个问题&#x…

一文搞清到底什么是 .NET?

现在各种 .NET 满天飞&#xff0c;别说新手了&#xff0c;连我这样的老手都差点被绕进去。到底什么是 .NET 呢&#xff1f;通俗易懂&#xff0c;什么是.NET?什么是.NET Framework&#xff1f;什么是.NET Core? 这篇文章好长呀&#xff0c;不知道你看完了没有&#xff0c;其实…

Service Mesh新成员:Consul 1.2

本文译自 HashiCorp 官网关于 Consul 1.2 支持 Service Mesh 发布的博客文章。原文链接&#xff1a;https://www.hashicorp.com/blog/consul-1-2-service-mesh作者&#xff1a;Mitchell Hashimoto 翻译&#xff1a;董干 转载自&#xff1a;https://blog.idevfun.io/consul-1-2-…