场景:

  在利用.net core进行api接口开发时,经常会因为需求,要开发实现统一功能的多版本的接口。比如版本V1是给之前用户使用,然后新用户有新需求,这时候可以单独给这个用户写接口,也可以在V1基础上写版本V2,这样V1的用户要使用V2的接口,只有稍微改一下就可以了。

实现:

  1.APIVersion

  首先需要安装Nuget包:Microsoft.AspNetCore.Mvc.Versioning  以及  Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer

  然后在ConfigureServices中添加以下内容;

 1             // API接口版本
2 services.AddApiVersioning(o => {
3 o.ReportApiVersions = true;
4 o.AssumeDefaultVersionWhenUnspecified = true;
5 //o.ApiVersionReader = new HeaderApiVersionReader("version");
6 o.DefaultApiVersion = new ApiVersion(1, 0);
7 });
8 services.AddVersionedApiExplorer( o => {
9 o.GroupNameFormat = "'v'VVV";
10 o.SubstituteApiVersionInUrl = true;
11 });

  同时在Configure中添加以下内容:

app.UseApiVersioning();

  ApiVersion用来配置默认版本,版本位置等,这里的ApiVersionReader可以设定api版本位置,比如是http中的Header位置,还是放在请求中。

  VersionedApiExplorer用来版本管理,其中的GroupNameFormat是api组名格式,而SubstituteApiVersionInUrl 是设置在url中替换版本

  之后在控制器上添加版本,如下:

    /// <summary>
/// 角色相关
/// </summary>
[ApiVersion("2.0")]
[TypeFilter(typeof(AuthFilter))]
[ApiController]
[Route("api/v{version:apiVersion}/[controller]/[action]")]
public class RoleController:ControllerBase
{
/// <summary>
/// 添加角色,版本2
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
[HttpPost,MapToApiVersion("2.0")]
public Response<DTO_Id> AddRole(DTO_AddOrUpdate_Role_V2 req)
{
}
}
   /// <summary>
/// 角色相关,版本1
/// </summary>
[ApiVersion("1.0")]
[TypeFilter(typeof(AuthFilter))]
[ApiController]
[Route("api/v{version:apiVersion}/[controller]/[action]")]
public class RoleController:ControllerBase
{
/// <summary>
/// 添加角色
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
[HttpPost]
public Response<DTO_Id> AddRole(DTO_AddOrUpdate_Role req)
{ }
}

  这里在apiVersion中设置控制器版本,同时可以通过参数不同来重载函数。这样就实现了版本控制

  2.swagger

  首先先导入nuget包,Swashbuckle.AspNetCore

  在ConfigureService中配置swaager,如下;

       var provider = services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>();
// swagger
services.AddSwaggerGen(c =>
{ // 排序方式
c.OrderActionsBy(o => o.HttpMethod);
foreach (var item in provider.ApiVersionDescriptions)
{
c.SwaggerDoc(item.GroupName, new OpenApiInfo
{
Title = "WebAPI" + item.GroupName,
Version = item.ApiVersion.MajorVersion.ToString() + "." + item.ApiVersion.MinorVersion
}); }
c.OperationFilter<GlobalHttpHeaderOperationFilter>();
// 重载方式
c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First()); foreach (var name in Directory.GetFiles(AppContext.BaseDirectory, "*.*",
SearchOption.AllDirectories).Where(f => Path.GetExtension(f).ToLower() == ".xml"))
{
c.IncludeXmlComments(name, includeControllerXmlComments: true);
}
});

  这里需要获取APIversion中各个版本的信息,可以利用services.BuildServiceProvider().GetRequiredService<>获取。

c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());

  同时这句是为了让swaager支持函数重载。而且可以通过OrderActionsBy来设置排序顺序。

  最后在Configure中使用swagger。

        app.UseSwagger();

            var provider = _services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>();
app.UseSwaggerUI(c =>
{
foreach (var item in provider.ApiVersionDescriptions)
{
c.SwaggerEndpoint($"/swagger/{item.GroupName}/swagger.json", item.GroupName);
}
});

  为了获取serviceCollection中的apiversion信息,需要添加如下;

private IServiceCollection _services;

  在ConfigureServices中添加:

_services = services;

  这样就能在Configure中使用ServiceCollention中的service了。

结果:

  

  可以通过swagger中的definition来选择接口版本,也能看到接口版本显示先url中。

利用swagger和API Version实现api版本控制的更多相关文章

  1. springboot+mybatis-puls利用swagger构建api文档

    项目开发常采用前后端分离的方式.前后端通过API进行交互,在Swagger UI中,前后端人员能够直观预览并且测试API,方便前后端人员同步开发. 在SpringBoot中集成swagger,步骤如下 ...

  2. C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi

    C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...

  3. springboot利用swagger构建api文档

    前言 Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件.本文简单介绍了在项目中集成swagger的方法和一些常见问题.如果想深入分析项目源码,了解更多内容,见参考资料. S ...

  4. Swagger 生成 ASP.NET Web API

    使用 Swagger 生成 ASP.NET Web API 在线帮助测试文档 原文:ASP.NET Web API Help Pages using Swagger作者:Shayne Boyer翻译: ...

  5. 使用Swagger服务搭建.Net Core API

    使用Swagger服务搭建.Net Core API 创建.Net Core API 新建项目.文件——新建——项目 选择应用程序模板. 设置存放路径,命名方案名称. 创建API. 搭建成功. 使用S ...

  6. Swagger解决你手写API接口文档的痛

    首先,老规矩,我们在接触新事物的时候, 要对之前学习和了解过的东西做一个总结. 01 痛     苦 不做.不行 之前,前后端分离的系统由前端和后端不同的编写,我们苦逼的后端工程师会把自己已经写完的A ...

  7. Android开发学习---template requires a minimum SDK version of at least 7,build target API version of 14

    adt 22.6.3的bug 当adt更新到22.6.3,其编辑器中最低支持api7,即android 2.1,这里可能是google故意这么做的,也可能是其bug.其target sdk 和comp ...

  8. 利用 Django REST framework 编写 RESTful API

    利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framewor ...

  9. SingleThreadModel is deprecated in Servlet API version 2.4

    Ensures that servlets handle only one request at a time. This interface has no methods. If a servlet ...

随机推荐

  1. 跟着官方文档学Maven构建生命周期

    在IntelliJ IDEA中,显示了Maven的Lifecycle: 只需要学习这些命令,就能构建一个Maven项目. 三个内置生命周期 Maven内置了三个生命周期:clean.default和s ...

  2. c#json将字符串反序列化成对象时不新建类的做法

    在服务端代码文件中加上struct结构体就能解决 struct LocationInfo { public string LocationID { get; set; } public string ...

  3. Java实现单例模式的几种方式

    单例模式(Singleton),保证在程序运行期间,内存中只有一个实例对象. 饿汉式,最常用的方式.JVM加载类到内存中时,创建实例,线程安全. public class Boss { private ...

  4. CSS 多行文本溢出省略显示

    文本溢出我们经常用到的应该就是text-overflow:ellipsis了,相信大家也很熟悉,但是对于多行文本的溢出处理确接触的不是很多,最近在公司群里面有同事问到,并且自己也遇到过这个问题,所以专 ...

  5. 陋居寡闻,初探Github CLI For Windows,开启命令行撸铁时代

    简介 gh is GitHub on the command line. It brings pull requests, issues, and other GitHub concepts to t ...

  6. 教你几招HASH表查找的方法

    摘要:根据设定的哈希函数 H(key) 和所选中的处理冲突的方法,将一组关键字映象到一个有限的.地址连续的地址集 (区间) 上,并以关键字在地址集中的"象"作为相应记录在表中的存储 ...

  7. ACdream 1007 a+b 快速幂 java秒啊,快速幂 避免 负数移位出错

    a + b ( sigma  (ai^x)  )  %  mod 1 import java.util.*; 2 import java.math.*; 3 import java.io.*; 4 p ...

  8. Pandas高级教程之:GroupBy用法

    Pandas高级教程之:GroupBy用法 目录 简介 分割数据 多index get_group dropna groups属性 index的层级 group的遍历 聚合操作 通用聚合方法 同时使用 ...

  9. Jenkins 进阶篇 - 权限配置

    Jenkins的授权策略 Jenkins 默认的授权策略是[登录用户可以做任何事],也就是人人都是管理员,可以修改所有的设置以及构建所有的任务,不用做任何设置,有账号登录到 Jenkins 系统即可, ...

  10. javascript数组 (转)

      javascript的Array可以包含任意数据类型,并通过索引来访问每个元素.   要取得Array的长度,直接访问length属性:   var arr = [1,2,3.14,'Hell0' ...