.NetCore使用Swagger+API多版本控制的流程分析

目录
  • 一、Swagger基本使用
  • 二、Swagger结合版本控制

本文实例环境及版本.NetCore3.1、Swagger6.1

现在的开发大部分都是前后端分离的模式了,后端提供接口,前端调用接口。后端提供了接口,需要对接口进行测试,之前都是使用浏览器开发者工具,或者写单元测试,再或者直接使用Postman,但是现在这些都已经out了。后端提供了接口,如何跟前端配合说明接口的性质,参数等这也是一个问题。有没有一种工具可以根据后端的接口自动生成接口文档,说明接口的性质,参数等信息,又能提供接口调用等相关功能呢?答案是有的。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。而作为.net core开发,Swashbuckle是swagger应用的首选!

总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法、参数和模型紧密集成到服务器端的代码,允许 API 来始终保持同步。Swagger 让部署管理和使用功能强大的 API 从未如此简单。

Swashbuckle.AspNetCore源码地址:https://github.com/domaindrivendev/Swashbuckle.AspNetCore

整个swagger页面访问流程如下:

  1、浏览器输入swaggerUI页面地址,比如:http://localhost:5000/swagger/index.html,这个地址是可配置的

  2、请求被SwaggerUI中间件拦截,然后返回页面,这个页面是嵌入的资源文件,也可以设置成外部自己的页面文件(使用外部静态文件拦截)

  3、页面接收到Swagger的Index页面后,会根据SwaggerUI中间件中使用SwaggerEndpoint方法设置的文档列表,加载第一个文档,也就是获取文档架构信息swagger.json

  4、浏览器请求的swagger.json被Swagger中间件拦截,然后解析属于请求文档的所有接口,并最终返回一串json格式的数据

  5、浏览器根据接收到的swagger,json数据呈现UI界面

一、Swagger基本使用

1、新建NetCore项目,添加相关Controller并添加引用Swashbuckle.AspNetCore.Swagger

2、在Startup中添加配置

在ConfigureServices中注入Swashbuckle服务

services.AddSwaggerGen(c =>
{
     c.SwaggerDoc("V1", new OpenApiInfo
     {
           //版本
           Version = "V1",
           //标题
           Title = $"接口文档-NetCore3.1",
           //描述
           Description = $"NetCore Http API v1",
           //联系方式
           Contact = new OpenApiContact { Name = "测试", Email = "", Url = new Uri("https://www.cnblogs.com/mzflog/") },
           License = new OpenApiLicense { Name = "测试2", Url = new Uri("https://www.cnblogs.com/mzflog/") }
      });
      // 加载XML注释
      c.IncludeXmlComments(XmlCommentsFilePath);
 });

新增XmlCommentsFilePath 属性,此时需要引用Microsoft.Extensions.PlatformAbstractions

/// <summary>
 /// 获取当前项目名的XML文件
 /// </summary>
 static string XmlCommentsFilePath
 {
     get
     {
         var basePath = PlatformServices.Default.Application.ApplicationBasePath;
         var fileName = typeof(Startup).GetTypeInfo().Assembly.GetName().Name + ".xml";
         return Path.Combine(basePath, fileName);
     }
  }

在Configure中添加Swagger中间件UseSwagger,UseSwaggerUI

UseSwagger:添加Swagger中间件,主要用于拦截swagger.json请求,从而可以获取返回所需的接口架构信息

UseSwaggerUI:添加SwaggerUI中间件,主要用于拦截swagger/index.html页面请求,返回页面给前端

app.UseSwagger();
 app.UseSwaggerUI(c =>
 {
     c.SwaggerEndpoint($"/swagger/V1/swagger.json", $"NetCore V1");
     //c.RoutePrefix = string.Empty;     //如果是为空 访问路径就为 根域名/index.html,注意localhost:8001/swagger是访问不到的
     //路径配置,设置为空,表示直接在根域名(localhost:8001)访问该文件
     c.RoutePrefix = "swagger"; // 如果你想换一个路径,直接写名字即可,比如直接写c.RoutePrefix = "swagger"; 则访问路径为 根域名/swagger/index.html
 });

右键项目属性在生成中添加XML

此时通过http://localhost:端口号/swagger即可访问

二、Swagger结合版本控制

版本控制的好处:

  1、有助于及时推出功能, 而不会破坏现有系统。

2、它还可以帮助为选定的客户提供额外的功能。

1、添加对Microsoft.AspNetCore.Mvc.Versioning和Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer的引用,本文使用版本4.1.0

2、在ConfigureServices中

services.AddApiVersioning(option =>
{
      // 可选,为true时API返回支持的版本信息
      option.ReportApiVersions = true;
      // 请求中未指定版本时默认为1.0
      option.DefaultApiVersion = new ApiVersion(1, 0);
      //版本号以什么形式,什么字段传递
      option.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version"));

      // 在不提供版本号时,默认为1.0  如果不添加此配置,不提供版本号时会报错"message": "An API version is required, but was not specified."
      //option.AssumeDefaultVersionWhenUnspecified = true;
      //默认以当前最高版本进行访问
      //option.ApiVersionSelector = new CurrentImplementationApiVersionSelector(option);
 }).AddVersionedApiExplorer(opt =>
 {
      //以通知swagger替换控制器路由中的版本并配置api版本
      opt.SubstituteApiVersionInUrl = true;
      // 版本名的格式:v+版本号
      opt.GroupNameFormat = "'v'VVV";
      //是否提供API版本服务
      opt.AssumeDefaultVersionWhenUnspecified = true;
 });
//方式一 (不建议使用)   此种方式报警告:ASP0000 从应用程序代码调用“BuildServiceProvider”会导致创建单例服务的附加副本。考虑替代方案,例如将依赖注入服务作为“配置”的参数
 services.AddSwaggerGen(options =>
 {
       // 解析IApiVersionDescriptionProvider服务
       var provider = services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>();

       //为每个发现的API版本添加一个swagger文档 可跳过不需要记录的
       foreach (var description in provider.ApiVersionDescriptions)
       {
            options.SwaggerDoc(description.GroupName, CreateInfoForApiVersion(description));
       }
     //加载XML注释  并启用控制器的注释信息默认为false不启用
       options.IncludeXmlComments(XmlCommentsFilePath,true);
  });

//方式二 (建议使用)
services.AddSwaggerGen();
//解决上面报ASP0000警告的方案
services.AddOptions<SwaggerGenOptions>()
        .Configure<IApiVersionDescriptionProvider>((options, service) =>
        {
             options.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
             // 添加文档信息
             foreach (var item in service.ApiVersionDescriptions)
             {
                 options.SwaggerDoc(item.GroupName, CreateInfoForApiVersion(item));
             }
             //给swagger添加过滤器
             //options.OperationFilter<SwaggerParameterFilter>();
             // 加载XML注释
             options.IncludeXmlComments(XmlCommentsFilePath, true);
        });

添加CreateInfoForApiVersion方法

static OpenApiInfo CreateInfoForApiVersion(ApiVersionDescription description)
 {
       var info = new OpenApiInfo()
       {
             //标题
             Title = $".NET Core API for 测试项目 {description.ApiVersion}",
             //当前版本
             Version = description.ApiVersion.ToString(),
             //文档说明
             Description = "api项目 当前环境-" + EnvironmentName,
             //联系方式
             Contact = new OpenApiContact() { Name = "标题", Email = "", Url = null },
             TermsOfService = new Uri(""),
             //许可证
             License = new OpenApiLicense() { Name = "文档", Url = new Uri("") }
         };      //当有弃用标记时的提示信息
         if (description.IsDeprecated)
         {
             info.Description += " - 此版本已放弃兼容";
         }
         return info;
   }

3、在Configure中添加

IApiVersionDescriptionProvider:用于枚举定义的API版本的API版本描述符提供程序

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApiVersionDescriptionProvider provider)

//添加Swagger中间件,主要用于拦截swagger.json请求,从而可以获取返回所需的接口架构信息
app.UseSwagger(opt =>
{
      //路由模板,默认值是/swagger/{documentName}/swagger.json,这个属性很重要!而且这个属性中必须包含{documentName}参数。
      //opt.RouteTemplate= "/swagger/{documentName}/swagger.json";
      // 表示按Swagger2.0格式序列化生成swagger.json,这个不推荐使用,尽可能的使用新版本的就可以了
      //opt.SerializeAsV2
 });
 //添加SwaggerUI中间件,主要用于拦截swagger / index.html页面请求,返回页面给前端
 app.UseSwaggerUI(options =>
 {
       // 为每个版本创建一个JSON
       foreach (var description in provider.ApiVersionDescriptions)
       {
             //这个属性是往SwaggerUI页面head标签中添加我们自己的代码,比如引入一些样式文件,或者执行自己的一些脚本代码
             //options.HeadContent += $"<script type='text/javascript'>alert('欢迎来到SwaggerUI页面')</script>";

             //展示默认头部显示的下拉版本信息
             //options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
             //自由指定头部显示的下拉版本内容
             options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", "coreApi" + description.ApiVersion);

              //如果是为空 访问路径就为 根域名/index.html,注意localhost:8001/swagger是访问不到的
              //options.RoutePrefix = string.Empty;
              // 如果你想换一个路径,直接写名字即可,比如直接写c.RoutePrefix = "swagger"; 则访问路径为 根域名/swagger/index.html
              options.RoutePrefix = "swagger";
        }
  });

4、在api的Controller中添加版本

[ApiVersion("1.0", Deprecated = false)] //Deprecated是否弃用该版本 默认为false不弃用。即使标记了弃用此接口还是会显示,只是做个提示此版本将会被弃用了。
 [Route("api/[controller]")]
 [ApiController]
 //[ApiExplorerSettings(IgnoreApi = true)] 隐藏该接口Controller
 public class ValuesController : Controller [Obsolete] //弃用该Action方法 [ApiExplorerSettings(IgnoreApi = true)] //隐藏该Action方法 public IEnumerable<string> Get()

为体验版本控制在新建一个控制器并添加 [ApiVersion("2.0")]

此时访问页面,在右侧的下拉框中可选择不同的版本,会展示不同版本下的控制器。

才疏学浅,相关文档等仅供自我总结,如有相关问题可留言交流谢谢。

原文地址:https://www.cnblogs.com/mzflog/p/14969620.html

世界再大也有尽头!

到此这篇关于.NetCore使用Swagger+API多版本控制的流程分析的文章就介绍到这了,更多相关.NetCore使用Swagger+API多版本控制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • ASP.NetCore使用Swagger实战

    踩坑不背锅,.NET Core 试深浅 关于Swagger什么是swagger所带来的帮助 使用Swagger 关于Swagger 什么是swagger 使人和计算机在看不到源码或者看不到文档或者不能通过网络流量检测的情况下能发现和理解各种服务的功能. Swagger™ 的目标是为 REST APIs 定义一个标准的,与语言无关的接口.只需要按照它的规范去定义接口及接口相关的信息.再通过Swagger衍生出来的一系列项目和工具,就可以做到生成各种格式的接口文档,生成多种语言的客户端和服务端的代码

  • .NetCore使用Swagger+API多版本控制的流程分析

    目录 一.Swagger基本使用 二.Swagger结合版本控制 本文实例环境及版本.NetCore3.1.Swagger6.1 现在的开发大部分都是前后端分离的模式了,后端提供接口,前端调用接口.后端提供了接口,需要对接口进行测试,之前都是使用浏览器开发者工具,或者写单元测试,再或者直接使用Postman,但是现在这些都已经out了.后端提供了接口,如何跟前端配合说明接口的性质,参数等这也是一个问题.有没有一种工具可以根据后端的接口自动生成接口文档,说明接口的性质,参数等信息,又能提供接口调用

  • NetCore 配置Swagger的详细代码

    目录 1.添加Nuget 2.添加静态类扩展方法 3.StartUp注册服务,添加中间件 1.添加Nuget install-package Swashbuckle.AspNetCore -project XXX -version 6.4.0 2.添加静态类扩展方法 2.1.生成项目xml:选中项目 / 右键 / 属性 / 生成 / 输出 / 选中xml文档文件 2.2.system_v1:必须唯一不重复,且[options.SwaggerDoc("system_v1"]必须与[opt

  • .Net Core Api 使用版本控制详解

    Api的版本控制是Api开发中经常遇到的问题, 在大部分中大型项目都需要使用到Api的版本控制 在本篇博客中,我们将说明一下如何在.Net Core Api项目中使用Api版本控制. 本篇博客中测试项目的开发环境: Visual Studio 2017 .Net Core 2.1 SDK 1,安装Microsoft.AspNetCore.Mvc.Versioning NET Core Mvc中,微软官方提供了一个可用的Api版本控制库Microsoft.AspNetCore.Mvc.Versio

  • Vue 使用typescript如何优雅的调用swagger API

    Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务,后端集成下Swagger,然后就可以提供一个在线文档地址给前端同学. 前端如何优雅的调用呢? 入门版 根据文档,用axios自动来调用 // 应用管理相关接口 import axios from '../interceptors.js' // 获取应用列表 export const getList = (data) => { return axios({ url: '/app/list?s

  • SpringBoot如何优雅的整合Swagger Api自动生成文档

    目录 前言 整合swagger api 自定义配置信息 简单使用 Swagger常用注解 Api标记 ApiOperation标记 ApiParam标记 ApiModel标记 ApiModelProperty标记 ApiIgnore标记 ApiImplicitParam标记 ApiImplicitParams标记 总结 前言 一个好的可持续交付的项目,项目说明,和接口文档是必不可少的,swagger api 就可以帮我们很容易自动生成api 文档,不需要单独额外的去写,无侵入式,方便快捷大大减少

  • koa2服务端使用jwt进行鉴权及路由权限分发的流程分析

    大体思路 后端书写REST api时,有一些api是非常敏感的,比如获取用户个人信息,查看所有用户列表,修改密码等.如果不对这些api进行保护,那么别人就可以很容易地获取并调用这些 api 进行操作. 所以对于一些api,在调用之前,我们在服务端必须先对操作者进行"身份认证",这就是所谓的鉴权. Json Web Token 简称为 JWT,它定义了一种通信双方之间以 JSON 对象的形式安全传递信息的方法.JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名,复杂度较

  • vue element后台鉴权流程分析

    前言: 最近项目遇到一个管理系统,感觉权限配置挺有意思,记录一下流程实现的过程,便于自己学习以及整理思路,部分思路整合在代码的注释中: 路由拦截鉴权常用的两种方法 1:路由拦截:单纯给路由加字段标识符,通过路由拦截实现 2:动态路由:第二种是通过路由的拆分另外需要后端的配合去实现的动态路由配置 比较: 路由拦截实现方式比较简单,只需要简单的在router.beforeEach中根据路由配置信息过滤页面是否有权限前往改组件,若相对于的权限不够则不前往相应的组件 动态路由实现相对比较复杂,并且需要后

  • 基于 antd pro 的短信验证码登录功能(流程分析)

    概要 最近使用 antd pro 开发项目时遇到个新的需求, 就是在登录界面通过短信验证码来登录, 不使用之前的用户名密码之类登录方式. 这种方式虽然增加了额外的短信费用, 但是对于安全性确实提高了不少. antd 中并没有自带能够倒计时的按钮, 但是 antd pro 的 ProForm components 中倒是提供了针对短信验证码相关的组件. 组件说明可参见: https://procomponents.ant.design/components/form 整体流程 通过短信验证码登录的

  • docker-compose镜像发布springboot项目的流程分析

    简介 Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排.Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project).Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理.因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理. Docker-Compose将所管理的

随机推荐