文章目录
前言
如果WebAPI做了版本升级或字段改变等操作后,又想老版本程序接口不受影响继续使用,该如何操作满足这个需求。
一、添加版本相关类
在Nuget中添加Microsoft.AspNetCore.Mvc.Versioning类库(现已弃用,可用新的包代替)。
二、新版本的字段和接口
1. 修改字段
新增新版本的字段(description),属性特性标记时不要使用required,不然会导致旧版本接口导入数据库时报错。直接手动实现一个判断该字段是否为空的方法,在ActionFilter中调用判断。
public string? Description { get; set; }
public bool ValidateDescription()
{
return !string.IsNullOrEmpty(Description);
}
2. 实现和使用ActionFilter
实现ActionFilter类,在OnActionExecuting手动判断新增字段(description)是否存在
public class Shirt_EnsureDescriptionIsPresentFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context);
var shirt = context.ActionArguments["shirt"] as Shirt;
if (shirt != null && !shirt.ValidateDescription())
{
context.ModelState.AddModelError("Shirt", "Descrition is required.");
var problemDetails = new ValidationProblemDetails(context.ModelState)
{
Status = StatusCodes.Status400BadRequest
};
context.Result = new BadRequestObjectResult(problemDetails);
}
}
}
新建V2版本的接口,将判断Descption的字段特性标注到接口方法上。
3. 更新数据库
打开Nuget程序包管理器控制台,输入Add-Migration AddDescriptionToShirt命令,生成迁移代码。
再输入Update-Database命令执行代码,在数据库生成新增字段。
三、配置版本信息
在program.cs文件中添加版本配置信息。
builder.Services.AddApiVersioning(options =>
{
// 没有版本信息配置时,会使用默认版本
options.AssumeDefaultVersionWhenUnspecified = true;
// 设置默认版本
options.DefaultApiVersion = new ApiVersion(1, 0);
});
给控制器类添加版本号信息。
设置好这些信息后,访问接口时会启动默认版本接口V1.0。(当前打开swagger文档会报错)
四、使用Header信息访问其他版本接口
通过Header信息访问其他版本接口可以使用配置完成。
builder.Services.AddApiVersioning(options =>
{
// 没有版本信息配置时,会使用默认版本
options.AssumeDefaultVersionWhenUnspecified = true;
// 设置默认版本
options.DefaultApiVersion = new ApiVersion(1, 0);
// 设置Header信息里的读取api版本的名称
options.ApiVersionReader = new HeaderApiVersionReader("X-API-Version");
});
通过Postman在Header头信息添加,就可以访问指定版本接口。
五、记录接口版本
设置ReportApiVersions为true,则会在接口的响应头信息里记录接口支持的所有版本号。
builder.Services.AddApiVersioning(options =>
{
// 记录Api版本
options.ReportApiVersions = true;
// 没有版本信息配置时,会使用默认版本
options.AssumeDefaultVersionWhenUnspecified = true;
// 设置默认版本
options.DefaultApiVersion = new ApiVersion(1, 0);
// 设置Header信息里的读取api版本的名称
options.ApiVersionReader = new HeaderApiVersionReader("X-API-Version");
});
六、使用路由信息访问其他版本接口
将header信息读取api版本的配置注释
builder.Services.AddApiVersioning(options =>
{
// 记录Api版本
options.ReportApiVersions = true;
// 没有版本信息配置时,会使用默认版本
options.AssumeDefaultVersionWhenUnspecified = true;
// 设置默认版本
options.DefaultApiVersion = new ApiVersion(1, 0);
// 设置Header信息里的读取api版本的名称
// options.ApiVersionReader = new HeaderApiVersionReader("X-API-Version");
});
修改版本文件的Route信息,参数里增加版本参数
需要按照该路由形式访问
七、使用查询字符串访问其他版本接口
将Route修改为原来形式
在网址查询时,后面输入?api-version=2.0进行访问
八、Swagger文档支持版本控制
当前打开Swagger文档会报错,需要修复该文档显示。
在Nuget中安装Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer类库
配置信息
swagger页面可以正常显示,在接口里可以输入版本号,来调用不同版本接口。
九、Swagger文档支持多版本显示
配置信息
swagger页面可以正常显示两个版本的接口,点击切换即可。