今天就跟大家聊聊有關(guān)怎么在.Net Core中控制Api版本,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
為龍華等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及龍華網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、龍華網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!前言
.NET Core 是指 .NET Core 運(yùn)行時(shí)和 .NET Core SDK,它包含開(kāi)發(fā)應(yīng)用程序所需的工具。 .NET Core SDK 可與任何以前版本的 .NET Core 運(yùn)行時(shí)一起使用。
簡(jiǎn)介
Api的版本控制是Api開(kāi)發(fā)中經(jīng)常遇到的問(wèn)題, 在大部分中大型項(xiàng)目都需要使用到Api的版本控制
測(cè)試項(xiàng)目的開(kāi)發(fā)環(huán)境:
Visual Studio 2017
.Net Core 2.1 SDK
.Net Core Api中使用Api版本控制
創(chuàng)建一個(gè)Api項(xiàng)目
首先我們創(chuàng)建一個(gè).NET Core Api項(xiàng)目
使用Nuget安裝Api版本控制庫(kù)
.NET Core Mvc中,微軟官方提供了一個(gè)可用的Api版本控制庫(kù)Microsoft.AspNetCore.Mvc.Versioning。 這里我們可以使用Nuget安裝這個(gè)包。
PM> Install-Package Microsoft.AspNetCore.Mvc.Versioning
修改Startup類(lèi)
Microsoft.AspNetCore.Mvc.Versioning庫(kù)安裝完成之后,下一步我們來(lái)添加Api版本控制服務(wù)。
這里我們需要在Startup類(lèi)的ConfigureService方法中添加以下代碼。
services.AddApiVersioning(o => { o.ReportApiVersions = true; o.AssumeDefaultVersionWhenUnspecified = true; o.DefaultApiVersion = new ApiVersion(1, 0); });
代碼解釋
ReportApiVersion 屬性是一個(gè)布爾類(lèi)型,如果設(shè)置為true, 在Api請(qǐng)求的響應(yīng)頭部,會(huì)追加當(dāng)前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屬性是為了標(biāo)記當(dāng)客戶端沒(méi)有指定版本號(hào)的時(shí)候,是否使用默認(rèn)版本號(hào)
DefaultApiVersion屬性即默認(rèn)版本號(hào)
創(chuàng)建多版本Api
這里為了測(cè)試.Net Core Mvc的Api版本控制庫(kù),我們創(chuàng)建如下2個(gè)Controller。
[ApiVersion("1.0")] [Route("api/values")] [ApiController] public class ValuesV1Controller : ControllerBase { [HttpGet] public IEnumerableGet() { 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 Get() { return new string[] { "value1 from Version 2", "value2 from Version 2" }; } }
代碼解釋
Value1Controller和Value2Controller使用了一樣的路由"/api/values"
Value1Controller類(lèi)頭部使用ApiVersion特性標(biāo)記了當(dāng)前Controller的Api版本號(hào)是1.0
Value2Controller類(lèi)頭部使用ApiVersion特性標(biāo)記了當(dāng)前Controller的Api版本號(hào)是2.0
-Value1Controller和Value2Controller都持有相同方法簽名的Get方法, 只是2個(gè)Get中返回了不同的字符串
現(xiàn)在我們啟動(dòng)項(xiàng)目,得到的結(jié)果如下,說(shuō)明當(dāng)沒(méi)有指定Api版本號(hào)時(shí),項(xiàng)目自動(dòng)使用1.0版本的Api, 即ValuesV1Controller中的Get方法。
如何在查詢字符串(Query String)中使用版本控制
Microsoft.AspNetCore.Mvc.Versioning支持以QueryString的形式指定請(qǐng)求Api的版本號(hào)。開(kāi)發(fā)人員可以在Url中指定api-version參數(shù)來(lái)選擇調(diào)用的Api版本號(hào)。
以當(dāng)前項(xiàng)目為例
當(dāng)請(qǐng)求https://localhost:44319/api/values?api-version=2.0時(shí), 返回結(jié)果
["value1 from Version 2","value2 from Version 2"]
當(dāng)請(qǐng)求https://localhost:44319/api/values?api-version=1.0時(shí), 返回結(jié)果
["Value1 from Version 1","value2 from Version 1"]
如何使用路由約束中指定請(qǐng)求Api的版本
Microsoft.AspNetCore.Mvc.Versioning還支持使用路由約束指定請(qǐng)求Api的版本號(hào)。
例: [Route(“api/{v:apiVersion}/Values”)]
我們對(duì)之前2個(gè)Controller的代碼作如下修改。
[ApiVersion("1.0")] [Route("api/{v:apiVersion}/values")] [ApiController] public class ValuesV1Controller : ControllerBase { [HttpGet] public IEnumerableGet() { 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 Get() { return new string[] { "value1 from Version 2", "value2 from Version 2" }; } }
現(xiàn)在我們通過(guò)以下2個(gè)Url請(qǐng)求Api, 返回的結(jié)果如下 :
/api/2.0/values
["value1 from Version 2","value2 from Version 2"]
/api/1.0/values
["Value1 from Version 1","value2 from Version 1"]
如何在請(qǐng)求頭(HTTP Header)中使用版本控制
以上的2種方式需要修改請(qǐng)求的Url, 如果你不喜歡這2種方式,Microsoft.AspNetCore.Mvc.Versioning還提供了第三種指定Api版本號(hào)的方式,即在HTTP請(qǐng)求頭中添加版本號(hào)參數(shù)。
為了啟用這種方式,我們首先需要在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"); });
這里通過(guò)ApiVersionReader屬性指定了Api版本號(hào)是從請(qǐng)求頭部的x-api-version屬性來(lái)的。
Tips: 一旦你使用o.ApiVersionReader = new HeaderApiVersionReader("x-api-version");
, 在查詢字符串中指定版本號(hào)的方式將不再可用,如果你希望同時(shí)支持2種方式,請(qǐng)改用o.ApiVersionReader = ApiVersionReader.Combine(new QueryStringApiVersionReader(), new HeaderApiVersionReader() { HeaderNames = { "x-api-version" }});
(多謝seamaswang的更正)
下面我們通過(guò)Postman來(lái)請(qǐng)求2.0的Api, 結(jié)果正確返回了。
其他特性棄用Api(Deprecated)特性
有些時(shí)候,我們需要標(biāo)記一些過(guò)時(shí)的Api為棄用狀態(tài),但是我們又不希望完全移除這個(gè)版本的Api, 我們可以使用Deprecated特性。
例:我們當(dāng)前希望棄用ValuesV1Controller, 我們可以指定Deprecated特性的值為true
[ApiVersion("1.0", Deprecated = true)] [Route("api/values")] [ApiController] public class ValuesV1Controller : ControllerBase { [HttpGet] public IEnumerableGet() { return new string[] { "Value1 from Version 1", "value2 from Version 1" }; } }
當(dāng)我們請(qǐng)求在此請(qǐng)求這個(gè)api的時(shí)候, 在響應(yīng)頭中會(huì)出現(xiàn)api-deprecated-versions和api-supported-versions2個(gè)屬性。
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
這段響應(yīng)的意思就是1.0版本的Api已經(jīng)過(guò)期了,2.0版本中有相同的Api, 可以換用2.0版本的Api。
使用ApiVersionNeutral指定不需要版本控制的Api
在編寫(xiě)Api的時(shí)候,對(duì)于一些非常簡(jiǎn)單的Api, 我們可能不需要指定Api版本號(hào), 例如健康檢查Api。我們可以使用ApiVersionNeutral特性,將它從Api版本控制中排除掉。
例:
[ApiVersionNeutral] [Route("api/[controller]")] [ApiController] public class HealthCheckController : ControllerBase { public string Get() { return "Good"; } }
看完上述內(nèi)容,你們對(duì)怎么在.Net Core中控制Api版本有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。