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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章