.NET Core 3.0 使用Nswag生成Api文档和客户端代码

摘要

在前后端分离、Restful API盛行的年代,完美的接口文档,成了交流的纽带。在项目中引入Swagger (也称为OpenAPI),是种不错的选择,它可以让接口数据可视化。下文将会演示

  • 利用Nswag如何生成Api文档

  • 利用NSwagStudio如何生成客户端代码,并且进行测试

什么是 Swagger/OpenAPI?

Swagger 是一个与语言无关的规范,用于描述 REST API。Swagger 项目已捐赠给 OpenAPI 计划,现在它被称为开放 API。这两个名称可互换使用,但 OpenAPI 是首选。它允许计算机和人员了解服务的功能,而无需直接访问实现(源代码、网络访问、文档)。其中一个目标是尽量减少连接取消关联的服务所需的工作量。另一个目标是减少准确记录服务所需的时间。

Nswag VS Swashbuckle?

.NET Swagger 实现类库有两个比较流行:

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

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

为什么我在.NET core3.0中选择NSwag呢,因为Swashbuckle目前不在维护了,而NSwag比较活跃,一直在更新,功能也很强大,可以完美的代替Swashbuckle.AspNetCore具体可以参考:https://github.com/aspnet/AspNetCore.Docs/issues/4258

一、利用Nswag生成Api文档

步骤
  1. 创建Asp.NET Core Api项目,并且集成NSwag

  2. 配置项目

  3. 运行项目

创建Asp.NET Core Api项目,并且集成NSwag

我们将简单的创建一个ASP.NET core API项目。将其命名为“WebAPIwithSwg”。基于.NETcore3.0

安装nuget包NSwag.AspNetCore

接下来,在Startup.cs文件中配置Nswag服务和中间件。

在ConfigureServices方法中添加服务

  public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSwaggerDocument(); //注册Swagger 服务
}
在Configure方法中添加Nswag中间件
 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.UseOpenApi(); //添加swagger生成api文档(默认路由文档 /swagger/v1/swagger.json)
app.UseSwaggerUi3();//添加Swagger UI到请求管道中(默认路由: /swagger).
}
配置项目

运行项目

右键项目在浏览器中查看,查看swagger UI需要在url后面添加“/swagger”。本示例http://localhost:54117/swagger

二、利用NSwagStudio如何生成客户端代码,并且进行测试
提供GUI界面是NSwag的一大特点,只需要下载安装NSwagStudio,即可生成客户端代码。
步骤
  1. 现在安装NSwagStudio

  2. NSwagStudio配置,生成客户端代码

  3. 创建测试客户端项目

下载安装NSwagStudio

下载NSwag Studio http://rsuter.com/Projects/NSwagStudio/installer.php 安装之后打开 NSwag Studio 如图

NSwagStudio配置,生成客户端代码

选择runtime,我选择的是NETCORE30,切换OpenAPI/Swagger Specification ,在Specification URL 输入你的Swagger.json路径,本示例:http://localhost:54117/swagger/v1/swagger.json输入路径之后,点击 create local copy 按钮获取json。

接下配置来生成客户端代码。我们首先选择“csharp client”复选框,然后勾选掉 “Inject Http Client via Constructor (life cycle is managed by caller)” ,最后设置下输出路径 点击生成文件(Generate Files)。步骤如下

到此客户端代码已经自动生成。

查看生成的部分代码

   public async System.Threading.Tasks.Task<System.Collections.Generic.ICollection<WeatherForecast>> GetAsync(System.Threading.CancellationToken cancellationToken)        {            var urlBuilder_ = new System.Text.StringBuilder();            urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/WeatherForecast");                var client_ = new System.Net.Http.HttpClient();            try            {                using (var request_ = new System.Net.Http.HttpRequestMessage())                {                    request_.Method = new System.Net.Http.HttpMethod("GET");                    request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json"));                        PrepareRequest(client_, request_, urlBuilder_);                    var url_ = urlBuilder_.ToString();                    request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute);                    PrepareRequest(client_, request_, url_);                        var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);                    try                    {                        var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value);                        if (response_.Content != null && response_.Content.Headers != null)                        {                            foreach (var item_ in response_.Content.Headers)                                headers_[item_.Key] = item_.Value;                        }                            ProcessResponse(client_, response_);                            var status_ = ((int)response_.StatusCode).ToString();                        if (status_ == "200")                         {                            var objectResponse_ = await ReadObjectResponseAsync<System.Collections.Generic.ICollection<WeatherForecast>>(response_, headers_).ConfigureAwait(false);                            return objectResponse_.Object;                        }                        else                        if (status_ != "200" && status_ != "204")                        {                            var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false);                             throw new ApiException("The HTTP status code of the response was not expected (" + (int)response_.StatusCode + ").", (int)response_.StatusCode, responseData_, headers_, null);                        }                                    return default(System.Collections.Generic.ICollection<WeatherForecast>);                    }                    finally                    {                        if (response_ != null)                            response_.Dispose();                    }                }            }            finally            {                if (client_ != null)                    client_.Dispose();            }        }
创建测试客户端项目

创建一个控制程序项目,命名“WebApiClient”。

把自动生成的类“WeatherForecastClient”添加到客户端项目中,然后安装Newtonsoft

最后在Main函数中添加测试代码,开始使用Api。

 static async System.Threading.Tasks.Task Main(string[] args)
{

var weatherForecastClient = new WeatherForecastClient();
//gets all values from the API
var allValues = await weatherForecastClient.GetAsync();
Console.WriteLine("Hello World!");
}

运行客户端应用程序,进行调用api

当然如果需要调试api项目内部代码,可以设置断点,进入一步一步的调试

小结:NSwag 功能远不止这些,本篇文章演示了如何生成api文档和自动生成的api客户端代码方便我们调试,也可以作为对应的sdk。

参考:微软官方文档---https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/getting-started-with-nswag?view=aspnetcore-2.2&tabs=visual-studio

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

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

相关文章

深入研究 Angular 和 ASP.NET Core 3.0

本文要点&#xff1a;可以把多个 Angular 应用程序集成到 ASP.NET 网站中把 Angular 代码打包成 Web 组件是引导 Angular 应用程序的好方法可以把用 Angular 编写的 Web 组件轻松地集成到 ASP.NET 视图中把 Angular 解决方案构造成 Angular 应用程序的集合以实现更好的代码重用…

操作系统内存管理--简单、页式、段式、段页式

一、内存管理的目的和功能 内存一直是计算机系统中宝贵而又紧俏的资源&#xff0c;内存能否被有效、合理地使用&#xff0c;将直接影响到操作系统的性能。此外&#xff0c;虽然物理内存的增长现在达到了N个GB&#xff0c;但比物理内存增长还快的是程序&#xff0c;所以无论物理…

网易裁员背后,芸芸众生,相煎何急

十一月初拖家带口去了上海&#xff0c;到了著名的城隍庙参观&#xff0c;无意中看到了一个仅出现在历史书上的古老物件“西洋镜”&#xff0c;仿佛跨越百年&#xff0c;来到那个如裹脚布般冗长而乏味的古老年代&#xff0c;看到了一群有一群卑微的小民在生活的裹挟之下&#xf…

.NET Core on K8S 学习与实践系列文章索引 (更新至20191126)

更新记录&#xff1a;-- 2019-11-26 增加Docker容器日志系列文章近期在学习Kubernetes&#xff0c;基于之前做笔记的习惯&#xff0c;已经写了一部分文章&#xff0c;因此给自己立一个flag&#xff1a;完成这个《.NET Core on K8S学习实践》系列文章&#xff01;这个系列会持续…

ASP.NET Core gRPC 使用 Consul 服务注册发现

一. 前言gRPC 在当前最常见的应用就是在微服务场景中&#xff0c;所以不可避免的会有服务注册与发现问题&#xff0c;我们使用gRPC实现的服务可以使用 Consul 或者 etcd 作为服务注册与发现中心&#xff0c;本文主要介绍Consul。二. Consul 介绍Consul是一种服务网络解决方案&a…

Excel催化剂插件功能修复与更新汇总篇之十

在半年时间里&#xff0c;自己使用过程中&#xff0c;发现的一些小bug&#xff0c;更新了一下&#xff0c;也追加了一些自定义函数&#xff0c;不成系统&#xff0c;就单独放在修复与更新系列中。一、第24波-批量发送邮件并指点不同附件不同变量Excel催化剂功能第24波-批量发送…

OSI/RM 开放系统互联参考模型

开放式系统互联通信参考模型&#xff08;即&#xff1a;Open System Interconnection Reference Model&#xff0c;简称为OSI模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;提出&#xff0c;一个试图使各种计算机在世界范围内互连为网络的标准框架。 OSI的七层体…

Http benchmarking 工具 wrk 基本使用

Http benchmarking 工具 wrk 基本使用Introwrk 是一款现代HTTP基准测试工具&#xff0c;能够在单个多核CPU上运行时产生显着负载。它将多线程设计与可扩展事件通知系统&#xff08;如epoll和kqueue&#xff09;结合在一起。官方描述&#xff1a;wrk is a modern HTTP benchmark…

TCP/IP 体系结构

TCP/IP体系结构又称为TCP/IP协议簇&#xff0c;是Transmission Control Protocol/Internet Protocol的简写&#xff0c;译为传输控制协议/因特网互联协议。 TCP/IP提供点对点的链接机制&#xff0c;将数据应该如何封装、定址、传输、路由以及在目的地如何接收&#xff0c;都加以…

黑客之道-解码Facebook的DevOps之路

内容来源&#xff1a;DevOps案例深度研究第3期 – Facebook DevOps实践研究战队&#xff08;本文只展示部分PPT及研究成果&#xff0c;更多细节请关注案例分享会&#xff0c;及本公众号。&#xff09;本案例内容贡献者&#xff1a;张楠&#xff08;Topic Leader&#xff09;、高…

IP地址与MAC地址的区别

IP地址是指互联网协议地址&#xff08;Internet Protocol Address&#xff09;&#xff0c;是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一个逻辑地址&#xff0c;以此来屏蔽物理地址的差异。 MAC地址又称…

ping命令整个过程详解

转自&#xff1a;http://wanicy.blog.51cto.com/509018/335207/ 如果你想了解ping命令的原理&#xff0c;看了这篇文章&#xff0c;你会从对网络一窍不通&#xff0c;到豁然开朗。 先看拓朴图&#xff1a; 在这里讲ping的两情况&#xff1a;一种是同一网段内&#xff0c;一种…

ping某个域名的详细过程

在前一篇文章中&#xff0c;我们已经对ping命令的整个过程做了一个详解。但是&#xff0c;前一篇文章中所涉及到的两种ping命令使用情况&#xff0c;都是ping的IP&#xff0c;在这篇文章中&#xff0c;我们将要详细讲解ping某个域名的整个过程。 一、ICMP协议 在了解ping命令之…

Magicodes.IE之导入学生数据教程

基础教程之导入学生数据说明本教程主要说明如果使用Magicodes.IE.Excel完成学生数据的Excel导入。要点本教程使用Magicodes.IE.Excel来完成Excel数据导入需要通过创建Dto来完成导入Magicodes.IE.Excel可以根据Dto以及特性设置来自动生成导入的Excel模板&#xff0c;数据验证&am…

IP地址分类详解

一、IP地址简介 IP&#xff0c;即网际协议&#xff08;Internet Protocol&#xff09;&#xff0c;或称互联网协议&#xff0c;是用于报文交换网络的一种面向数据的协议。 IP是在TCP/IP协议中网络层的主要协议&#xff0c;任务是仅仅根据源主机和目的主机的地址传送数据。为此目…

[ASP.NET Core 3框架揭秘] 文件系统[1]:抽象的“文件系统”

ASP.NET Core应用 具有很多读取文件的场景&#xff0c;比如配置文件、静态Web资源文件&#xff08;比如CSS、JavaScript和图片文件等&#xff09;以及MVC应用的View文件&#xff0c;甚至是直接编译到程序集中的内嵌资源文件。这些文件的读取都需要使用到一个IFileProvider对象。…

[原]调试PInvoke导致的内存破坏

缘起 最近项目中遇到一个诡异的问题&#xff0c;程序在升级到.net4.6.1后&#xff0c;执行某个功能时会崩溃&#xff0c;提示访问只读内存区。大概规律如下:debug版不崩溃&#xff0c;release版稳定崩溃。只有x64位的程序崩溃&#xff0c;32位及anycpu编译出来的程序运行不会崩…

被忽略的TraceId,可以用起来了

前言.NetCore日志&#xff0c;相信大家多少都接触过&#xff0c;博客园有关 ① AspNetCore依赖注入第三方日志组件 ②第三方日志组件Nlog,Serilog 应用方法的博文层出不穷。结合程序的部署结构&#xff0c;本文分单体和微服务聊一聊AspNetCore中追踪日志流的方法。TraceIdAsp…

TCP协议详解

一、TCP协议简介 TCP协议&#xff0c;即传输控制协议&#xff08;Transmission Control Protocol&#xff09;&#xff0c;是一种面向连接的、可靠的、基于字节流的传输层通信协议。在因特网协议族中&#xff0c;TCP层是位于IP层之上&#xff0c;应用层之下的中间层。尽管IP层只…

UDP协议详解

一、UDP协议简介 UDP协议&#xff0c;即用户数据报协议&#xff08;User Datagram Protocol&#xff09;&#xff0c;是一个简单的面向数据报的传输层协议。UDP协议只在IP数据报服务商增加了很少一点的功能&#xff0c;就是复用和分用&#xff0c;以及差错检测的功能。 二、UDP…