Net Core Api 接口版本管理
简单介绍
感谢
创建 ASP.NET Core Web Api
本次操作环境条件
创建项目
versioning的版本控制的方法
第一步,通过Nuget安装包
第二步, 在Startup.cs里的ConfigureServices方法中。
加入几个控制器
EmployeeV1Controller.cs
EmployeeV2Controller.cs
基于请求参数
基于路由地址
EmployeeV1Controller.cs
EmployeeV2Controller.cs
基于HTTP 请求头的操作
简单介绍
学习如何对ASP.NET Core Web API进行版本控制以及对API进行版本控制的一些不同方法。我们还将创建一个简单的Web API并实现版本控制。
感谢
每次学习都是学习了其他人的作品。照着别人的代码写一遍理解一下,这或许也是叫做学习把,
【大家是怎么做APP接口的版本控制的?欢迎进来看看我的方案。升级版的Versioning】 ,感谢作者oppoic,这篇文章用的是 Asp.net API 做案例,里面也提到过用Versioning 版本控制 ;
【API Versioning in ASP.NET Core
】 ,感谢作者sumit-kharche,这篇文章用的是Asp.net Core Api 做案里,基本介绍了【Versioning】如何使用;
全新的github地址: 【Microsoft.aspnet-api-versioning】 ,这里面也有支持各种的基本案例;
创建 ASP.NET Core Web Api
本次操作环境条件
1、运行环境,操作环境:
2、测试 postman
创建项目
创建新项目->ASP.NET Core Web 应用程序 ->下一步
项目名称修改->文件存放地址修改->创建
选择运行平台->选中API->不启用‘为HTTPS 配置’ ->点击创建
4.F5运行,在postman里输入地址可查看
以上 - 大家都知道的废话已说完!
versioning的版本控制的方法
通过请求参数
通过路由地址
通过HTTP请求头
当前还有其他方法->没有在其他文章里发现,我也不会☺
第一步,通过Nuget安装包
Microsoft.AspNetCore.Mvc.Versioning
1
看了看去,还是使用第二个把,API不也就是扩展于MVC啊,
第二步, 在Startup.cs里的ConfigureServices方法中。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddApiVersioning(x =>
{
x.DefaultApiVersion = new ApiVersion(1, 0);
x.AssumeDefaultVersionWhenUnspecified = true;
x.ReportApiVersions = true;
});
}
对于 Service.AddApiVersioning()里面的参数理解:
x.DefaultApiVersion = new ApiVersion(1, 0);
字面意思: 设置一个 默认版本;
x.AssumeDefaultVersionWhenUnspecified = true;
F12 看到的注释翻译出来的以上: 当客户端未指定任何版本时,此标志AssumeDefaultVersionWhenUnspecified标志用于设置默认版本。如果我们没有将此标志设置为true,并且客户端未提及版本就点击了API,则会发生UnsupportedApiVersion异常。
x.ReportApiVersions = true;
F12 看到的注释翻译出来的以上:在响应标头中返回API版本。
也即是如下:
加入几个控制器
EmployeeV1Controller.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace WebApplication1.Controllers
{
[ApiController]
[ApiVersion("1.0")]
[Route("api/employee")]
// [Route("api/{v:apiVersion}/employee")]
public partial class EmployeeV1Controller : ControllerBase
{
[HttpGet]
public virtual IActionResult Get()
{
return new OkObjectResult("v1 Controller Employee");
}
//PUT api/<EmployeeV4Controller>/5
[HttpPut("{id}")]
public IActionResult Put(int id)
{
return new OkObjectResult($"v1 Controller Employee{id}");
}
// POST api/<EmployeeV4Controller>
[HttpPost]
public IActionResult Post(string value)
{
return new OkObjectResult($"v1 Post Value:{value}");
}
}
}
EmployeeV2Controller.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace WebApplication1.Controllers
{
[ApiController]
[ApiVersion("2.0")]
[Route("api/employee")]
//[Route("api/{v:apiVersion}/employee")]
public class EmployeeV2Controller : EmployeeV1Controller
{
[HttpGet]
public override IActionResult Get()
{
return new OkObjectResult("v2 Controller Employee");
}
}
}
基于请求参数
完成以上创作基本就可以实现基于请求参数的案例,
在Postman里添加
http://localhost:11111/api/employee?api-version=1
http://localhost:11111/api/employee?api-version=1.0
以上2种方式都是可行的,
修改对应的api-version=?即可获得对应版本的接口,这里我们用的是大版本,后续有小的版本修改,代码里添加对应的代码,这边的参数可修改成 1.X,,如下面2张图所示
注意这里的virtual 方法,跟override 方法,
个人觉得:如果当前这个接口,需要升级那么就重载这个方法,这样的话前面版本的方法也没改变,部署的时候以前的接口也是可以调用不修改之前的业务;如果有新的业务,那么在当前这个版本的控制器定义要给虚方法,下次代码升级就重载一下就好啦 。
当然还有默认可以使用,重新创建个控制器,设置控制器版本,然后在重新定义一个相同的方法,这样出去的接口也是可行的。
不过总感觉这样的接口没有关联。前者的思路我也并没有进行性能上的测试,也还不知道效率怎么样!?
基于路由地址
这里只需要配置路由即可
EmployeeV1Controller.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace WebApplication1.Controllers
{
[ApiController]
[ApiVersion("1.0")]
//[Route("api/employee")]
[Route("api/v{v:apiVersion}/employee")]
public partial class EmployeeV1Controller : ControllerBase
{
[HttpGet]
public virtual IActionResult Get()
{
return new OkObjectResult("v1 Controller Employee");
}
//PUT api/<EmployeeV4Controller>/5
[HttpPut("{id}")]
public IActionResult Put(int id)
{
return new OkObjectResult($"v1 Controller Employee{id}");
}
// POST api/<EmployeeV4Controller>
[HttpPost]
public IActionResult Post(string value)
{
return new OkObjectResult($"v1 Post Value:{value}");
}
}
}
EmployeeV2Controller.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace WebApplication1.Controllers
{
[ApiController]
[ApiVersion("2.0")]
// [Route("api/employee")]
[Route("api/v{v:apiVersion}/employee")]
public class EmployeeV2Controller : EmployeeV1Controller
{
[HttpGet]
public override IActionResult Get()
{
return new OkObjectResult("v2 Controller Employee");
}
}
}
这里的路由
[Route("api/{v:apiVersion}/employee")]
1
我加了个’v’,不然就没那个味了 'http://localhost:5000/api/1.0/employee/'像这样的路由看着有点儿不舒服