当我们在开发一个webapi项目的时候,如果api接口需要同时支持多个版本,比如接口被修改后,但是我们想支持老版本的前端(这里的前端可能是网页、app、小程序等。),
这种情况在app中很常见。毕竟我们可以主动控制网页前端的发布。只要大家的浏览器在统一发布后下次访问网页时都会重新加载最新版本的代码,但像app一样,不能保证用户会在第一时间升级更新最新版本的app。
所以往往要求api接口可以同时保持多个版本的逻辑,用支持新旧版本的调用app进行调用。以上面的描述为例:比如一个创建用户的界面,
Api/user/createuser如果此时我们修改了这个接口的输入和返回参数,但是希望原来的api/user/createuser接口逻辑也能正常运行,常见的方法如下:
本文使用vs2022直接创建ASP.NET Webapi项目。创建项目后,安装以下nuget包:SwashBuckle。AspnetCoreCrosoft。AspnetCore。MVC。版本控制。ApiExplorer注册API版本控制服务。
//了解有关在https://aka.ms/aspnetcore/swashbuckle构建器中配置Swagger/OpenAPI的详细信息106 .服务。AddEndpointsApiExplorer();建筑商106 .服务。AddSwaggerGen();//配置超文本传送协议请求管道。如果(app .环境。是开发()){ app .使用swagger();应用程序.UseSwaggerUI();}采用如下时髦的配置
#地区注册大摇大摆的建设者106 .服务。AddTransient,SwaggerConfigureOptions();建筑商106 .服务。AddSwaggerGen(options={ options .操作过滤器();选项IncludeXmlComments(路径。组合(AppContext .BaseDirectory,$ ' {类型的(程序)。组装。getname().名称} .XML ')、true);});#结束区域其中用到了两个自定义的类SwaggerConfigureOptions和SwaggerOperationFilter,
///////昂首阔步集成多版本美国石油学会(美国石油协会)自定义设置///公共类SwaggerOperationFilter:IOperationFilter { public void Apply(open API operation operation,OperationFilterContext context){ var API description=context .应用程序接口描述;//判断接口遗弃状态,
然后只需添加版本标签[API版本(' 1')] [API版本(' 2')] [API版本('')]到相应文件夹下的控制器头,如下图所示。
这样就配置了两个版本的UserController,具体控制器内部的代码可以不同。然后运行项目观察Swagger UI,会发现下图:
你可以通过SwaggerUI的右上角在SwaggerDoc的版本之间切换。
当您单击在单一界面中尝试时,api版本字段也会出现在界面侧。
因为我们这边配置了从Header传参数,所以从接口上可以看到字段是从Header传过来的。如果您想从url传递它,
主要调整上面注册api版本控制服务的设置,从查询传入。至此,基本的api版本控制逻辑完成。下面的推导解释了如果项目中的一些api控制器不需要版本控制,
这是一个全球性和普遍的处理方式。有时候一个项目中总会有一些基本的API基本不会改变。每次升级API版本都要升级所有的控制器,显然太繁琐了。
所以我们可以分别标记一些全局控制器。只要将[ApiVersionNeutral]标签添加到这些控制器的头部,
标有【ApiVersionNeutral】的控制器表示控制器已经退出版本控制逻辑,无论app前端传入的版本号是多少,都可以正常进入控制逻辑。如下
[API版本中立][API控制器][路由(' API/[控制器]')]公共类文件控制器:控制器基础{ }还有一种就是当我们的美国石油学会(美国石油协会)版本升级之后,
[ApiVersion('1 '已弃用=true)][API控制器][路由(' API/[控制器]')]公共类用户控制器:控制器基础{[http post(' create user ')]公共void创建用户(DtoCreateUser创建用户){//内部注册逻辑此处省略} }添加淘汰标记之后运行斯瓦格瑞就会出现下图的样式
通过SwaggerDoc可以明显看出,v1版本的api已经被淘汰。
标题:.Net WebApi 实现 接口版本控制并打通Swagger支持
链接:https://www.52hkw.com/news/rj/56744.html
版权:文章转载自网络,如有侵权,请联系删除!