.NET实现API版本控制
目录
- 1. 优点
- 2. API版本控制
- 2.1 安装组件
- 2.1.1 常用配置
- 2.2 QueryString来实现版本控制
- 2.2.1 ConfigureServices中配置
- 2.2.2 控制器设置版本
- 2.2.3 特定方法设置版本
- 2.2.4 设置不受版本控制
- 2.3.5 访问地址
- 2.3 URL Path Segment来实现版本控制
- 2.3.1 ConfigureServices中配置
- 2.3.2 控制器设置版本
- 2.3.3 特定方法设置版本
- 2.3.4 设置不受版本控制
- 2.3.5 访问地址
- 2.4 HTTP Headers来实现版本控制
- 2.4.1 ConfigureServices中配置
- 2.4.2 控制器设置版本
- 2.4.3 特定方法设置版本
- 2.4.4 设置不受版本控制
- 2.4.5 访问地址
- 2.5 同时支持多种模式
- 2.6 不借助包,封装文件
1. 优点
- 有助于保护原有系统,不受影响,并及时修改问题
- 可以实现用户的私人定制(比如是付费接口)
- 快速迭代
2. API版本控制
- 在URL中追加版本或者作为查询字符串参数
- 通过自动以标头和通过接受标头
2.1 安装组件
ASP.NET API versioning为您提供了一种功能强大但易于使用的方法,用于将API版本控制语义添加到使用ASP.NET构建的新的和现有的REST服务中。API版本控制扩展定义了简单的元数据属性和约定,用于描述您的服务实现了哪些API版本。
2.1.1 常用配置
[ApiVersion("1.1")] //设置版本号[ApiVersionNeutral]//退出版本控制[MapToApiVersion("1.1")] //设置独立版本[ApiVersion("1.0", Deprecated = true)]//api版本已经被弃用HttpContext.GetRequestedApiVersion().ToString(); //访问版本信息
2.2 QueryString来实现版本控制
2.2.1 ConfigureServices中配置
//Versioning用来实现API的版本控制services.AddApiVersioning(options =>{options.DefaultApiVersion = new ApiVersion(1, 1); //默认版本号options.AssumeDefaultVersionWhenUnspecified = true; //此选项将用于不提供版本的请求,默认情况下假定API的版本为1.0options.ReportApiVersions = true; //当设置为true时候,api将返回响应标头中支持的版本信息//下面这句默认不写也可以//options.ApiVersionReader = new QueryStringApiVersionReader(parameterNames: "api-version"); //该名称用于查询时候使用});
2.2.2 控制器设置版本
namespace NetCore_SwaggerVersion.Controllers.v1{/// /// 版本1.1/// [Route("api/[controller]")][ApiController][ApiVersion("1.1")]//可以设置多个[ApiVersion("1.2")]public class TestController : ControllerBasenamespace NetCore_SwaggerVersion.Controllers.v2{/// /// 版本2.0/// [Route("api/[controller]")][ApiController][ApiVersion("2.6")]public class TestController : ControllerBase
不同命名空间下可以存在相同的控制器
2.2.3 特定方法设置版本
[MapToApiVersion("1.1")][HttpGet]public IEnumerable Get()
2.2.4 设置不受版本控制
[ApiVersionNeutral]//退出版本控制[ApiController][Route("api/[controller]/[action]")]public class WeatherForecastController : ControllerBase
2.3.5 访问地址
http://localhost:5000/api/WeatherForecast/Get //不写版本号的话走的是默认的版本号http://localhost:5000/api/Test?api-version=1.1http://localhost:5000/api/Test?api-version=1.2http://localhost:5000/api/Test?api-version=2.6
2.3 URL Path Segment来实现版本控制
2.3.1 ConfigureServices中配置
//Versioning用来实现API的版本控制services.AddApiVersioning(options =>{options.DefaultApiVersion = new ApiVersion(1, 1); //默认版本号options.AssumeDefaultVersionWhenUnspecified = true; //此选项将用于不提供版本的请求,默认情况下假定API的版本为1.0options.ReportApiVersions = true; //当设置为true时候,api将返回响应标头中支持的版本信息});
2.3.2 控制器设置版本
namespace NetCore_SwaggerVersion.Controllers.v1{/// /// 版本1.1/// [Route("api/v{version:apiVersion}/[controller]")][ApiController][ApiVersion("1.0")][ApiVersion("1.1")]//定义控制器提供哪个版本的APIpublic class TestController : ControllerBasenamespace NetCore_SwaggerVersion.Controllers.v2{/// /// 版本2.0/// [Route("api/v{version:apiVersion}/[controller]")][ApiController][ApiVersion("2.6")]public class TestController : ControllerBase
不同命名空间下可以存在相同的控制器
2.3.3 特定方法设置版本
[MapToApiVersion("1.1")][HttpGet]public IEnumerable Get()
2.3.4 设置不受版本控制
[ApiVersionNeutral]//退出版本控制[ApiController][Route("api/[controller]/[action]")]public class WeatherForecastController : ControllerBase
2.3.5 访问地址
http://localhost:5000/api/v1.0/Testhttp://localhost:5000/api/v1.1/Testhttp://localhost:5000/api/v2.6/Testhttp://localhost:5000/api/WeatherForecast/Get 不受版本控制
2.4 HTTP Headers来实现版本控制
2.4.1 ConfigureServices中配置
//Versioning用来实现API的版本控制services.AddApiVersioning(options =>{options.DefaultApiVersion = new ApiVersion(1, 1); //默认版本号options.AssumeDefaultVersionWhenUnspecified = true; //此选项将用于不提供版本的请求,默认情况下假定API的版本为1.0options.ReportApiVersions = true; //当设置为true时候,api将返回响应标头中支持的版本信息//header传递版本信息options.ApiVersionReader = new HeaderApiVersionReader("version"); options.ApiVersionSelector = new CurrentImplementationApiVersionSelector(options); //如果没有传输版本号,那么会使用最大版本号LowestImplementedApiVersionSelector是最小版本号options.UseApiBehavior = false; //是否使用API行为});
2.4.2 控制器设置版本
namespace NetCore_SwaggerVersion.Controllers.v1{/// /// 版本1.1/// [Route("api/[controller]")][ApiController][ApiVersion("1.1")]//定义控制器提供哪个版本的APIpublic class TestController : ControllerBasenamespace NetCore_SwaggerVersion.Controllers.v2{/// /// 版本2.0/// [Route("api/[controller]")][ApiController][ApiVersion("2.6")]public class TestController : ControllerBase
不同命名空间下可以存在相同的控制器
2.4.3 特定方法设置版本
[MapToApiVersion("1.1")][HttpGet]public IEnumerable Get()
2.4.4 设置不受版本控制
[ApiVersionNeutral]//退出版本控制[ApiController][Route("api/[controller]/[action]")]public class WeatherForecastController : ControllerBase
2.4.5 访问地址
http://localhost:5000/api/Test//需要在headers里面增加 version: 1.1http://localhost:5000/api/WeatherForecast/Get 不受版本控制
2.5 同时支持多种模式
services.AddApiVersioning(o =>{o.ReportApiVersions = true; o.AssumeDefaultVersionWhenUnspecified = true; o.DefaultApiVersion = new ApiVersion(1, 0); o.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version"), new QueryStringApiVersionReader("api-version")); //或者//同时支持查询字符串和标头o.ApiVersionReader = new QueryStringOrHeaderApiVersionReader(parameterName: "version"){HeaderNames = { "api-version", "x-ms-version" }}});
2.6 不借助包,封装文件
public class NameSpaceVersionRoutingConvention:IApplicationModelConvention{private readonly string apiPrefix; private const string urlTemplate = "{0}/{1}/{2}"; public NameSpaceVersionRoutingConvention(string apiPrefix = "api"){this.apiPrefix = apiPrefix; }public void Apply(ApplicationModel application){foreach (var controller in application.Controllers){var hasRouteAttribute = controller.Selectors.Any(x => x.AttributeRouteModel != null); if (!hasRouteAttribute){continue; }var nameSpaces = controller.ControllerType.Namespace.Split('.'); //获取namespace中版本号部分var version = nameSpaces.FirstOrDefault(x => Regex.IsMatch(x, @"^v(\d+)$")); if (string.IsNullOrEmpty(version)){continue; }string template = string.Format(urlTemplate, apiPrefix, version,controller.ControllerName); controller.Selectors[0].AttributeRouteModel = new AttributeRouteModel(){Template = template}; }}}
调试代码发现这种方式只在程序第一次运行的时候会执行,之后不会再执行多次,因此效率很高。
【.NET实现API版本控制】到此这篇关于.NET实现API版本控制的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- C语言从0到1|【C语言】字符串函数及模拟实现strlen&&strcpy&&strcat&&strcmp
- vue.js实现开关(switch)组件实例代码
- 前端使用JSON.stringify实现深拷贝的巨坑详解
- 泰康投资张敬国(协同集团战略布局,实现穿越周期的投资)
- SSM实现物流管理系统快递
- Docker构建镜像的两种方式实现
- node.js模拟实现自动发送邮件验证码
- docker中mysql开启日志的实现步骤
- vue中按钮操作完刷新页面的实现
- Docker搭建MySQL5.7主从复制的实现