利用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 ...
随机推荐
- 技术实践:教你用Python搭建gRPC服务
摘要:gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf序列化协议开发,且支持众多开发语言. 本文分享自华为云社区& ...
- Docker启动PostgreSQL时创建多个数据库
1 前言 在文章<Docker启动PostgreSQL并推荐几款连接工具>中我们介绍如何通过Docker来启动PostgreSQL,但只有一个数据库,如果想要创建多个数据库在同一个Dock ...
- 高性能的Redis数据结构小结
一.概述 Redis 作为一种 KV 缓存服务器,有着极高的性能,相对于 Memcache,Redis 支持更多种数据类型,因此在业界应用广泛. 记得刚毕业那会参加面试,面试官会问我 Redis 为什 ...
- Kubernetes的资源管理
本节讲解为一个pod配置资源的预期使用量和最大使用量.通过设置这两组参数,可以确保pod公平地使用Kubernetes集群资源,同时也影响着整个集群pod的调度方式. 1.为pod中的容器申请资源 创 ...
- gitla 报错 The project you were looking for could not be found or you don't have permission to view it.
gitlab项目组下创建项目 $ git push -u git@192.168.101.129:/DrvOps/Dev_Test : 报错信息如下: remote: ================ ...
- 21、nginx之ngx_http_proxy_module模块
Nginx 的代理功能是通过 ngx_http_proxy_module 模块来实现的.默认在安装 Nginx 时已经安装了ngx_http_proxy_module模 块,因此可直接使用 ngx_h ...
- Gym 101308D Database 枚举
大致题意: 给出一张表,n行m列,每一行的列用逗号分隔.判断这个表是否有冗余元素.如果一张表中有两行两列对应的的元素相同,那么这个表就有冗余元素. 分析: 先枚举要排序的列,然后枚举行,如果相邻两行相 ...
- 安装eclipse及Helloworld体验
准备工作 如果没有配置java环境变量的请移步:https://www.cnblogs.com/lhns/p/9638105.html 下载eclipse 网址:https://www.eclipse ...
- [心得]安装MongoDB
1. 安装 (1) 其他默认 (2) 创建文件 在 E:\DevTools\MongoDB\Server\3.4 1 1 E:\DevTools\MongoDB\Server\3.4 下创建dat ...
- 关于scrollview的无限滚动效果实现
起因及需求:做过阅读器的朋友应该知道,一般的阅读器都会有仿真.平移等特效.最近赶上真空期,项目不忙,有点时间,于是想抓起来,总结点干货. 仿真翻页及平滑翻页的基本实现: 仿真翻页,使用系统自带的UIP ...