NetCoreAPI版本控制
随着我们的APP运行的时间越来越久,功能也越来越复杂,我们经常会修改一些接口的入参以及输出参数,不同的APP版本会导致我们需要不同的API版本。在这篇文章中,我会分享一些我在开发API中解决版本控制的方法。
本片文章中项目的开发环境:
-
Visual Studio 2017
-
.Net Core 2.0 SDK
使用Nuget安装Api版本控制库
PM> Install-Package Microsoft.AspNetCore.Mvc.Versioning
修改Startup类
在Startup类的ConfigureService方法中添加以下代码。
services.AddApiVersioning(c => {
c.AssumeDefaultVersionWhenUnspecified = true;
//该属性设置为true就在请求链接中未设置版本时使用初始版本
c.DefaultApiVersion = new Microsoft.AspNetCore.Mvc.ApiVersion(1,0);
//设置初始版本,ApiVersion的方法有多个重载,有兴趣可以多研究一下。
});
ReportApiVersions 属性如果设置为true, 在Api请求的响应头部,会在返回的头中显示所有拥有的版本号,如下图
测试版本控制
namespace Test.API.Controllers
{
//这里应该是Versioning插件将内联路由约束给重写了,不然我们无法使用apiVersion来作为约束的。想深入的话最好了解一下Netcore的路由约束。
//里面不要有空格。
[Route("api/v{v:apiVersion}/[controller]")]
//之所以把路由写在这里是因为我们大部分API都需要版本控制,所以为了不用在每个类上写,我们就让所有的控制器都集成这个控制器,这样就会减去一些不必要的编码了。
public class BaseController : Controller
{
}
}
namespace InsuranceMarketing.API.Controllers
{
//如果项目已经做了一部分了。初始版本可以不写上的。当然第二及以后版本需要加上。
[ApiVersion("1.0"), ControllerName("TestVersion")]
public class TestV1Controller : BaseController
{
[HttpGet, Route("Version")]
public string GetTest()
{
return "我是V1版本";
}
}
}
namespace InsuranceMarketing.API.Controllers
{
//这里是版本控制,以及控制器的别名,为了让不同控制器的方法以版本的形式让路由找到。
[ApiVersion("2.0"), ControllerName("TestVersion")]
public class TestV2Controller : BaseController
{
//路由名称需写为同名
[HttpGet, Route("Version")]
public string GetTestV2()
{
return "我是V2版本";
}
}
}
现在我们来调用一下。
http://localhost:56650/api/v1.0/TestVersion/Version
http://localhost:56650/api/v2.0/TestVersion/Version
当然,版本控制还有其他方法像在url后面添加版本参数,或者在请求头中添加版本参数。这里就不细说了。
这是github:https://github.com/Microsoft/aspnet-api-versioning/wiki