场景:

  在利用.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. 重新整理 .net core 实践篇—————仓储层的具体实现[二十七]

    前言 简单整理一下仓储层. 正文 在共享层的基础建设类库中: /// <summary> /// 泛型仓储接口 /// </summary> /// <typeparam ...

  2. 入门Kubernetes - YAML文件

    前言 前篇文章中简单了解到如何把.Net Core 程序部署到k8s中,过程中使用了多个*.yaml文件,那么这些文件的格式及含义.语法是如何的呢? 接下来,进一步了解学习 一.YAML介绍: 1.简 ...

  3. go语言结构体内存对齐

    cpu要想从内存读取数据,需要通过地址总线,把地址传输给内存,内存准备好数据,输出到数据总线,交给cpu,如果地址总线只有8根,那这个地址就只有8位可以表示[0,255]256个地址,因为表示不了更多 ...

  4. 如何在微信小程序的模板渲染中使用JS?

    在微信小程序中使用模板渲染时,可能需要用JS对其进行处理. <view class="price text-red text-lg"> <!-- 价格保留两位小数 ...

  5. MongoDB数据库 5分钟快速上手

    安装 本次安装使用docker镜像,安装无障碍,一行命令即可解决 # 安装镜像并启动 可以自行修改命令中的参数 ## 账户 tanoak 密码 123123 ## -p 27018:27017 映射端 ...

  6. vsftpd配置文件详解(转)

      vsftpd配置文件详解     1.默认配置: 1>允许匿名用户和本地用户登陆.      anonymous_enable=YES      local_enable=YES 2> ...

  7. 羊城杯wp babyre

    肝了好久,没爆破出来,就很难受,就差这题没写了,其他三题感觉挺简单的,这题其实也不是很难,我感觉是在考算法. 在输入之前有个smc的函数,先动调,attach上去,ida打开那个关键函数. 代码逻辑还 ...

  8. F5负载均衡_monitors(健康检查)

    故障现象: 后端有5台服务器,每个服务器上跑着8个应用.使用F5做应用负载调度.这40个应用里面,3-10个应用在高峰期的时候weblogic的DOS窗口显示与数据库断开连接(端口通.业务断),但是F ...

  9. Docker从容器拷贝文件到宿主机或从宿主机拷贝文件到容器

    1.从容器里面拷文件到宿主机? 答:在宿主机里面执行以下命令 docker cp 容器名:要拷贝的文件在容器里面的路径       要拷贝到宿主机的相应路径 示例: 假设容器名为testtomcat, ...

  10. 【Java数据结构与算法】简单排序、二分查找和异或运算

    简单排序 选择排序 概念 首先,找到数组中最小的那个元素,其次,把它和数组的第一个元素交换位置(如果第一个元素就是最小的元素那么它就和自己交换).再次,在剩下的元素中找到最小的元素,将它与数组的第二个 ...