.NET实现API版本控制

.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版本。

<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="4.2.0" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="4.2.0" /> 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.0 options.ReportApiVersions = true;//当设置为true时候,api将返回响应标头中支持的版本信息 //下面这句默认不写也可以 //options.ApiVersionReader = new QueryStringApiVersionReader(parameterNames: "api-version");//该名称用于查询时候使用 }); 2.2.2 控制器设置版本 namespace NetCore_SwaggerVersion.Controllers.v1 { /// <summary> /// 版本1.1 /// </summary> [Route("api/[controller]")] [ApiController] [ApiVersion("1.1")]//可以设置多个 [ApiVersion("1.2")] public class TestController : ControllerBase namespace NetCore_SwaggerVersion.Controllers.v2 { /// <summary> /// 版本2.0 /// </summary> [Route("api/[controller]")] [ApiController] [ApiVersion("2.6")] public class TestController : ControllerBase

不同命名空间下可以存在相同的控制器

2.2.3 特定方法设置版本 [MapToApiVersion("1.1")] [HttpGet] public IEnumerable<string> 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.1 http://localhost:5000/api/Test?api-version=1.2 http://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.0 options.ReportApiVersions = true;//当设置为true时候,api将返回响应标头中支持的版本信息 }); 2.3.2 控制器设置版本 namespace NetCore_SwaggerVersion.Controllers.v1 { /// <summary> /// 版本1.1 /// </summary> [Route("api/v{version:apiVersion}/[controller]")] [ApiController] [ApiVersion("1.0")] [ApiVersion("1.1")]//定义控制器提供哪个版本的API public class TestController : ControllerBase namespace NetCore_SwaggerVersion.Controllers.v2 { /// <summary> /// 版本2.0 /// </summary> [Route("api/v{version:apiVersion}/[controller]")] [ApiController] [ApiVersion("2.6")] public class TestController : ControllerBase

不同命名空间下可以存在相同的控制器

2.3.3 特定方法设置版本 [MapToApiVersion("1.1")] [HttpGet] public IEnumerable<string> Get() 2.3.4 设置不受版本控制 [ApiVersionNeutral]//退出版本控制 [ApiController] [Route("api/[controller]/[action]")] public class WeatherForecastController : ControllerBase 2.3.5 访问地址 http://localhost:5000/api/v1.0/Test http://localhost:5000/api/v1.1/Test http://localhost:5000/api/v2.6/Test http://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.0 options.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 { /// <summary> /// 版本1.1 /// </summary> [Route("api/[controller]")] [ApiController] [ApiVersion("1.1")]//定义控制器提供哪个版本的API public class TestController : ControllerBase namespace NetCore_SwaggerVersion.Controllers.v2 { /// <summary> /// 版本2.0 /// </summary> [Route("api/[controller]")] [ApiController] [ApiVersion("2.6")] public class TestController : ControllerBase

不同命名空间下可以存在相同的控制器

2.4.3 特定方法设置版本 [MapToApiVersion("1.1")] [HttpGet] public IEnumerable<string> 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.1 http://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版本控制的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持易知道(ezd.cc)。

推荐阅读

    678元的索泰zt-h55d3-m1dh主板

    678元的索泰zt-h55d3-m1dh主板,,近日,索泰zt-h55d3-m1dh主板已经运到市场,这是基于英特尔H55芯片组。它支持LGA 1156接口的酷睿i系列处理器

    学习写字楼新选择6000元主流配置

    学习写字楼新选择6000元主流配置,,这种配置需要考虑双核心的办公和娱乐平台,充分考虑办公室的办公需求和娱乐需求,以约6000元的预算和cost-e

    金蝶专业版审核以前期间的单据

    金蝶专业版审核以前期间的单据,,1.之前会计是手工做账,现在是金蝶做账,需要什么资料入初始数据在金碟里把你手工帐的科目设置好,然后启用帐

    excel怎么用乘法函数

    excel怎么用乘法函数,乘法,函数,哪个,excel乘法函数怎么用?1、首先用鼠标选中要计算的单元格。2、然后选中单元格后点击左上方工具栏的fx公

    金蝶担保机构业务管理系统

    金蝶担保机构业务管理系统,,1.金蝶财务软件怎么使用?软件使用方法 使用需要先登陆到数据库,可只导出V3数据或只导出最新年度数据。功能介绍

    wps如何合并章节

    wps如何合并章节,WPS教程,1.WPS表格如何实现单元格合并?WPS 表格在新版本中增加了“合并单元格”系列按钮,同时配有下拉菜单和快捷键。新增