深入讲解.Net Core中的Api版本控制
前言
.net core 是指 .net core 运行时和 .net core sdk,它包含开发应用程序所需的工具。 .net core sdk 可与任何以前版本的 .net core 运行时一起使用。
本文主要介绍了关于.net core api版本控制的相关内容,下面话不多说了,来一起看看详细的介绍吧
原文链接:api versioning in .net core
作者:neel bhatt
简介
api的版本控制是api开发中经常遇到的问题, 在大部分中大型项目都需要使用到api的版本控制
在本篇博客中,我们将说明一下如何在.net core api项目中使用api版本控制。
本篇博客中测试项目的开发环境:
- visual studio 2017
- .net core 2.1 sdk
.net core api中使用api版本控制
创建一个api项目
首先我们创建一个.net core api项目
使用nuget安装api版本控制库
.net core mvc中,微软官方提供了一个可用的api版本控制库microsoft.aspnetcore.mvc.versioning。 这里我们可以使用nuget安装这个包。
pm> install-package microsoft.aspnetcore.mvc.versioning
修改startup类
microsoft.aspnetcore.mvc.versioning库安装完成之后,下一步我们来添加api版本控制服务。
这里我们需要在startup类的configureservice方法中添加以下代码。
services.addapiversioning(o => { o.reportapiversions = true; o.assumedefaultversionwhenunspecified = true; o.defaultapiversion = new apiversion(1, 0); });
代码解释
reportapiversion 属性是一个布尔类型,如果设置为true, 在api请求的响应头部,会追加当前api支持的版本, 例
response header api-supported-versions: 1.0 content-type: application/json; charset=utf-8 date: sat, 06 oct 2018 05:24:21 gmt server: kestrel status: 200 x-powered-by: asp.net
assumedefaultversionwhenunspecified属性是为了标记当客户端没有指定版本号的时候,是否使用默认版本号
defaultapiversion属性即默认版本号
创建多版本api
这里为了测试.net core mvc的api版本控制库,我们创建如下2个controller。
[apiversion("1.0")] [route("api/values")] [apicontroller] public class valuesv1controller : controllerbase { [httpget] public ienumerable<string> get() { return new string[] { "value1 from version 1", "value2 from version 1" }; } } [apiversion("2.0")] [route("api/values")] [apicontroller] public class valuesv2controller : controllerbase { [httpget] public ienumerable<string> get() { return new string[] { "value1 from version 2", "value2 from version 2" }; } }
代码解释
- value1controller和value2controller使用了一样的路由"/api/values"
- value1controller类头部使用apiversion特性标记了当前controller的api版本号是1.0
- value2controller类头部使用apiversion特性标记了当前controller的api版本号是2.0
-value1controller和value2controller都持有相同方法签名的get方法, 只是2个get中返回了不同的字符串
现在我们启动项目,得到的结果如下,说明当没有指定api版本号时,项目自动使用1.0版本的api, 即valuesv1controller中的get方法。
如何在查询字符串(query string)中使用版本控制
microsoft.aspnetcore.mvc.versioning支持以querystring的形式指定请求api的版本号。开发人员可以在url中指定api-version参数来选择调用的api版本号。
以当前项目为例
当请求https://localhost:44319/api/values?api-version=2.0时, 返回结果
["value1 from version 2","value2 from version 2"]
当请求https://localhost:44319/api/values?api-version=1.0时, 返回结果
["value1 from version 1","value2 from version 1"]
如何使用路由约束中指定请求api的版本
microsoft.aspnetcore.mvc.versioning还支持使用路由约束指定请求api的版本号。
例: [route(“api/{v:apiversion}/values”)]
我们对之前2个controller的代码作如下修改。
[apiversion("1.0")] [route("api/{v:apiversion}/values")] [apicontroller] public class valuesv1controller : controllerbase { [httpget] public ienumerable<string> get() { return new string[] { "value1 from version 1", "value2 from version 1" }; } } [apiversion("2.0")] [route("api/{v:apiversion}/values")] [apicontroller] public class valuesv2controller : controllerbase { [httpget] public ienumerable<string> get() { return new string[] { "value1 from version 2", "value2 from version 2" }; } }
现在我们通过以下2个url请求api, 返回的结果如下 :
/api/2.0/values
["value1 from version 2","value2 from version 2"]
/api/1.0/values
["value1 from version 1","value2 from version 1"]
如何在请求头(http header)中使用版本控制
以上的2种方式需要修改请求的url, 如果你不喜欢这2种方式,microsoft.aspnetcore.mvc.versioning还提供了第三种指定api版本号的方式,即在http请求头中添加版本号参数。
为了启用这种方式,我们首先需要在startup.cs中修改microsoft.aspnetcore.mvc.versioning的配置, 代码如下:
services.addapiversioning(o => { o.reportapiversions = true; o.assumedefaultversionwhenunspecified = true; o.defaultapiversion = new apiversion(1, 0); o.apiversionreader = new headerapiversionreader("x-api-version"); });
这里通过apiversionreader属性指定了api版本号是从请求头部的x-api-version属性来的。
tips: 一旦你使用o.apiversionreader = new headerapiversionreader("x-api-version");
, 在查询字符串中指定版本号的方式将不再可用,如果你希望同时支持2种方式,请改用o.apiversionreader = apiversionreader.combine(new querystringapiversionreader(), new headerapiversionreader() { headernames = { "x-api-version" }});
(多谢seamaswang的更正)
下面我们通过postman来请求2.0的api, 结果正确返回了。
其他特性弃用api(deprecated)特性
有些时候,我们需要标记一些过时的api为弃用状态,但是我们又不希望完全移除这个版本的api, 我们可以使用deprecated特性。
例:我们当前希望弃用valuesv1controller, 我们可以指定deprecated特性的值为true
[apiversion("1.0", deprecated = true)] [route("api/values")] [apicontroller] public class valuesv1controller : controllerbase { [httpget] public ienumerable<string> get() { return new string[] { "value1 from version 1", "value2 from version 1" }; } }
当我们请求在此请求这个api的时候, 在响应头中会出现api-deprecated-versions和api-supported-versions2个属性。
response header api-deprecated-versions: 1.0 api-supported-versions: 2.0 content-type: application/json; charset=utf-8 date: sat, 06 oct 2018 06:32:18 gmt server: kestrel status: 200 x-powered-by: asp.net
这段响应的意思就是1.0版本的api已经过期了,2.0版本中有相同的api, 可以换用2.0版本的api。
使用apiversionneutral指定不需要版本控制的api
在编写api的时候,对于一些非常简单的api, 我们可能不需要指定api版本号, 例如健康检查api。我们可以使用apiversionneutral特性,将它从api版本控制中排除掉。
例:
[apiversionneutral] [route("api/[controller]")] [apicontroller] public class healthcheckcontroller : controllerbase { public string get() { return "good"; } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
推荐阅读