[ASP.NET Core] 為專案加上API版本控制

讓專案的API可以藉由版本號區分,讓兩種版本並且同名的API可以同時並行,讓使用者可以自行選擇要使用的API版本,避免新API為了兼容舊使用者,無法做大幅度的設計/架構改動。

安裝 Nuget package

dotnet add package Microsoft.AspNetCore.Mvc.Versioning

在Startup加上設定

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddApiVersioning(options =>
    {
        // 預設的API版本
        options.DefaultApiVersion = new ApiVersion(1, 0);

        // 是否在未指定版本時使用預設版本
        options.AssumeDefaultVersionWhenUnspecified = true;

        // 在response header顯示該api支援的版本
        options.ReportApiVersions = true;
        
        // 指定從queryString取得版本號的參數(預設是api-version)
        options.ApiVersionReader = new QueryStringApiVersionReader("ver");
    });
}

QuertString

為 Api 加上 ApiVersionAttribute

[ApiController]
[Route("My/[action]")]
public class MyController : ControllerBase
{
    [ApiVersion("1.0")]
    [HttpGet]
    public string Get()
    {
        return "1.0";
    }
}

[ApiController]
[Route("My/[action]")]
public class My2Controller : ControllerBase
{
    [ApiVersion("2.0")]
    [HttpGet]
    public string Get()
    {
        return "2.0";
    }
}

測試三種情況

如果把前面的 AssumeDefaultVersionWhenUnspecified 改成 false,再試一次不指定版本的方式,會返回錯誤訊息

Route

在 Route 指定參數並搭配 RouteConstraintName(預設為apiVersion)

[ApiController]
[ApiVersion("1.0")]
[Route("My/v{version:apiVersion}/[action]")]
public class MyController : ControllerBase
{
    [HttpGet]
    public string Get()
    {
        return "1.0";
    }
}

[ApiController]
[ApiVersion("2.0")]
[Route("My/v{version:apiVersion}/[action]")]
public class My2Controller : ControllerBase
{
    [HttpGet]
    public string Get()
    {
        return "2.0";
    }
}

接著就可以從 Route 指定 Version


GitHub aspnet-api-versioning