利用swagger和API Version实现api版本控制
场景:
在利用.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版本控制的更多相关文章
- springboot+mybatis-puls利用swagger构建api文档
项目开发常采用前后端分离的方式.前后端通过API进行交互,在Swagger UI中,前后端人员能够直观预览并且测试API,方便前后端人员同步开发. 在SpringBoot中集成swagger,步骤如下 ...
- C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...
- springboot利用swagger构建api文档
前言 Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件.本文简单介绍了在项目中集成swagger的方法和一些常见问题.如果想深入分析项目源码,了解更多内容,见参考资料. S ...
- Swagger 生成 ASP.NET Web API
使用 Swagger 生成 ASP.NET Web API 在线帮助测试文档 原文:ASP.NET Web API Help Pages using Swagger作者:Shayne Boyer翻译: ...
- 使用Swagger服务搭建.Net Core API
使用Swagger服务搭建.Net Core API 创建.Net Core API 新建项目.文件——新建——项目 选择应用程序模板. 设置存放路径,命名方案名称. 创建API. 搭建成功. 使用S ...
- Swagger解决你手写API接口文档的痛
首先,老规矩,我们在接触新事物的时候, 要对之前学习和了解过的东西做一个总结. 01 痛 苦 不做.不行 之前,前后端分离的系统由前端和后端不同的编写,我们苦逼的后端工程师会把自己已经写完的A ...
- 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 ...
- 利用 Django REST framework 编写 RESTful API
利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framewor ...
- 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 ...
随机推荐
- ConcurrentSkipListMap - 秒懂
疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 面试必备 + 面试必备 [博客园总入口 ] 疯狂创客圈 经典图书 : <Sprin ...
- 还在担心写的一手烂SQL,送你4款工具
对于正在运行的mysql,性能如何,参数设置的是否合理,账号设置的是否存在安全隐患,你是否了然于胸呢? 俗话说工欲善其事,必先利其器,定期对你的MYSQL数据库进行一个体检,是保证数据库安全运行的重要 ...
- 懒人 IDEA 插件推荐:EasyCode 一键帮你生成所需代码
Easycode是idea的一个插件,可以直接对数据的表生成entity,controller,service,dao,mapper,无需任何编码,简单而强大. 1.安装(EasyCode) 我这里的 ...
- SpringMVC 进阶版
请求限制 一些情况下我们可能需要对请求进行限制,比如仅允许POST,GET等... RequestMapping注解中提供了多个参数用于添加请求的限制条件 value 请求地址 path 请求地址 m ...
- 自动按需引入组件用不了(Vant)
按照官网的自动按需引入之后,这样写是报错的,直接在vue页面中这样引用也是报错的. 正确的使用方法是这样的
- 本地SQL Server怎么连接服务器上的数据库
在阿里云的安全组规则中的入方向加上端口1433就好了,首先得要有这个,其他的都是后话
- 13、win10系统远程桌面oracle修正问题
1.A电脑(Windows 10)远程连接B电脑(Widows Server 2016), 出现错误: 出现身份验证错误.要求的函数不受支持 远程计算机:xx.xx.xx.xx 这可能是由于CredS ...
- 4、nfs服务器的搭建
4.1.nfs服务介绍: samba服务器一般互联网企业不会使用 nfs服务的端口是不固定的,需要先启动rpc服务对nfs服务端口进行注册 4.2.安装nfs: rpm -qa nfs-utils r ...
- Mybatis学习(4)实现关联数据的查询
有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表 ...
- Python+unittest+excel
接口测试设计思想: 框架结构如下: 目录如下: readme: config下的run_case_config.ini 文件说明: run_mode: 0:获取所有sheet页 1: if case_ ...