ASP.NET Core 3.x API版本控制
前言
一般来说需要更改我们API的时候才考虑版本控制,但是我觉得我们不应该等到那时候来实现它,我们应该有一个版本策略从我们应用程序开发时就开始制定好我们的策略,我们一直遵循着这个策略进行开发。
我们其实可以通过多种方式进行实现我们API版本的控制,其实对于版本控制没有最好的方式,这完全取决于我们面向的使用者。
API版本控制类型
安装版本控制包
Install-Package Microsoft.AspNetCore.Mvc.Versioning
在Startup.cs
中的ConfigureServices
方法中进行版本设置,以及在控制器通过特性进行设置版本,这样可以实现版本控制。
services.AddApiVersioning(options => {
options.DefaultApiVersion = new ApiVersion(1, 0);
options.AssumeDefaultVersionWhenUnspecified = true;
options.ReportApiVersions = true;
});
options.DefaultApiVersion = new ApiVersion(1,0)
: 这个设置不是必须的,因为默认情况下给我们设置的是1.0,但是显式的声明出来是一个很好的习惯,当然DefaultApiVersion
它会将默认的[ApiVersion("1.0")]
添加到控制器上,也就是说它会隐式的绑定API版本,但是为了我们方便理解或者说方便我们后面开发建议显式的设置。options.AssumeDefaultVersionWhenUnspecified = true
:默认API版本控制需要将其属性设置为true才可以开启options.ReportApiVersions = true
:默认情况下它是禁用的,启用此选项后,来自我们API端点的响应将带有标头,告诉我们的客户端支持或不推荐使用哪个版本(api-supported-versions: 1.1, 2.0, api-deprecated-versions: 1.0)
默认提供了四种版本控制方法:
- 字符串参数
- 通过HTTP请求头
- URL方式
- 媒体类型(Media Type)
默认方法是使用名为api-version
的查询字符串参数。我们还可以自己定义一个版本控制规则。
API版本约束方式
- 字符串参数形式
services.AddApiVersioning(options =>
options.ApiVersionReader = new QueryStringApiVersionReader("v"));
- HTTP请求头
services.AddApiVersioning(options =>
options.ApiVersionReader = new HeaderApiVersionReader("api-version"));
- 组合方式
services.AddApiVersioning(options => {
options.ApiVersionReader = ApiVersionReader.Combine(
new QueryStringApiVersionReader("v"),
new HeaderApiVersionReader("v"));});
- URL方式
services.AddApiVersioning(options => options.ApiVersionReader =
new UrlSegmentApiVersionReader());
我们可以更改代表版本的参数名称(例如,在上面的查询字符串方法中,我们使用字母v
代替默认的api-version
)。
控制器和方法中添加版本信息
选择版本控制策略并在ConfigureServices方法中对其配置后,我们可以开始对API端点进行版本控制,我们可以将这些属性应用于控制器和方法。
- 控制器的默认可能没有任何API版本属性,并隐式配置的默认API版本。默认配置使用值1.0。
- 使用[ApiVersion("1.0")]属性注释我们的控制器,意味着该控制器支持API版本1.0
- 控制器可以支持多个API版本。只需[ApiVersion(...)]在控制器上应用多个属性
- 为了区分控制器支持的多个版本,我们使用[MapToApiVersion()]属性注释控制器方法。
如果要使用URL路径则可以参考如下代码片段:
[Route("api/v{version:apiVersion}/[controller]")]
API控制器弃用,我们只需要设置
[ApiVersion("1.0", Deprecated = true)]
可通过如下方法方式获取所有API版本信息
var apiVersion = HttpContext.GetRequestedApiVersion();
当然他还支持模型绑定,我们还可以通过模型形式获取
[HttpGet]
public string Get(ApiVersion apiVersion) => $"Controller = {GetType().Name}\nVersion = {apiVersion}";
}
API版本约束
我们除了在方法和控制器上指定我们的版本,我们还可以采用另一种方式
services.AddApiVersioning( options =>
{
options.Conventions.Controller<HomeController>().HasApiVersion(1, 0);
});
看如上代码我们可以看到我们在这里给HomeController
配置版本,这样方便我们集中管理我们的版本。
services.AddApiVersioning( options =>
{
options.Conventions.Controller<MyController>()
.HasDeprecatedApiVersion(1, 0)
.HasApiVersion(1, 1)
.HasApiVersion(2, 0)
.Action(c => c.Get1_0()).MapToApiVersion(1, 0)
.Action(c => c.Get1_1()).MapToApiVersion(1, 1)
.Action(c => c.Get2_0()).MapToApiVersion(2, 0);
});
可以同时使用API版本约束和版本控制属性。
当然我们还可以自定义约束,从.NET Core 3.0开始,有一个IControllerConvention用于此目的的接口。
options.Conventions.Add(new MyCustomConvention());
当然我们还可以通过不同命名空间中的接口进行约束
options.Conventions.Add(new VersionByNamespaceConvention());
比如下面这种文件形式
api/v1/UsersController
api/v2/UsersController
api/v2_1/UsersController
映射后的路径如下所示
api/1.0/users
api/2.0/users
api/2.1/users
ASP.NET Core 3.x API版本控制的更多相关文章
- .Net Core中的Api版本控制
原文链接:API Versioning in .Net Core 作者:Neel Bhatt 简介 Api的版本控制是Api开发中经常遇到的问题, 在大部分中大型项目都需要使用到Api的版本控制 在本 ...
- 【转】.Net Core中的Api版本控制
原文链接:API Versioning in .Net Core 作者:Neel Bhatt 简介 Api的版本控制是Api开发中经常遇到的问题, 在大部分中大型项目都需要使用到Api的版本控制 在本 ...
- ASP.NET Core WebApi构建API接口服务实战演练
一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...
- 温故知新,使用ASP.NET Core创建Web API,永远第一次
ASP.NET Core简介 ASP.NET Core是一个跨平台的高性能开源框架,用于生成启用云且连接Internet的新式应用. 使用ASP.NET Core,您可以: 生成Web应用和服务.物联 ...
- angular4和asp.net core 2 web api
angular4和asp.net core 2 web api 这是一篇学习笔记. angular 5 正式版都快出了, 不过主要是性能升级. 我认为angular 4还是很适合企业的, 就像.net ...
- ASP.NET Core 中基于 API Key 对私有 Web API 进行保护
这两天遇到一个应用场景,需要对内网调用的部分 web api 进行安全保护,只允许请求头账户包含指定 key 的客户端进行调用.在网上找到一篇英文博文 ASP.NET Core - Protect y ...
- 使用ASP.NET Core构建RESTful API的技术指南
译者荐语:利用周末的时间,本人拜读了长沙.NET技术社区翻译的技术标准<微软RESTFul API指南>,打算按照步骤写一个完整的教程,后来无意中看到了这篇文章,与我要写的主题有不少相似之 ...
- Asp.Net Core 5 REST API - Step by Step
翻译自 Mohamad Lawand 2021年1月19日的文章 <Asp.Net Core 5 Rest API Step by Step> [1] 在本文中,我们将创建一个简单的 As ...
- Asp.Net Core 5 REST API 使用 JWT 身份验证 - Step by Step
翻译自 Mohamad Lawand 2021年1月22日的文章 <Asp Net Core 5 Rest API Authentication with JWT Step by Step> ...
随机推荐
- vue-infinite-scroll------vue的无线滚动插件
vue-infinite-scroll------vue的无线滚动插件 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 V ...
- Git 向远端仓库推文件
第一次推送: 1.git init (创建本地仓库) 2. git remote add origin <远端仓库地址> (与远端仓库建立链接) 3.git checkout -b < ...
- 第六章第二十题(计算一个字符串中字母的个数)(Count the letters in a string) - 编程练习题答案
*6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法头计算字符串中的字母个数: public static int countLetters(String s) 编写一个测试程序,提示 ...
- 【HBase】集群搭建/安装部署
目录 第一步:下载对应的HBase安装包 第二步:上传压缩包并解压 第三步:修改配置文件 第四步:安装包分发到另外两台机器 第五步:三台机器创建软连接 第六步:三台机器添加环境变量 第七步:启动HBa ...
- 【Kafka】监控及运维——kafka-eagle
目录 简单介绍 概述 安装部署 一.环境要求 二.下载源码包并解压 三.准备数据库 四.修改配置文件 五.配置环境变量 六.启动kafka-eagle 七.成功运行 简单介绍 概述 Kafka-eag ...
- leeCode刷题 1078
给出第一个词 first 和第二个词 second,考虑在某些文本 text 中可能以 "first second third" 形式出现的情况,其中 second 紧随 firs ...
- thread模块—Python多线程编程
Thread 模块 *注:在实际使用过程中不建议使用 thread 进行多线程编程,本文档只为学习(或熟悉)多线程使用. Thread 模块除了派生线程外,还提供了基本的同步数据结构,称为锁对象(lo ...
- 【clear linux】intel clear linux 电源状态命令
# 重启系统 $ sudo systemctl reboot # 关闭系统,切断电源 $ sudo systemctl poweroff # CPU停止工作 $ sudo systemctl halt ...
- Winform GDI+ 绘图一:绘制2D电池
winform桌面软件开发,在工业控制领域的使用还是很广泛的,打算好好学习一下GDI+绘图.以前都是用别人的轮子,自己也打算封装一些工业控制领域常用的控件. 今天要将的是,利用缓动函数动态绘制电池. ...
- pytest——pycharm中右击运行(run)没有问题,在terminal中运行pytest报错:E ModuleNotFoundError: No module named
参考了这个解决办法:https://blog.csdn.net/qq_36829091/article/details/82180866 我的是Windows,linux的和Windows的解决办法有 ...