ASP.NET Core 3.0 实战:构建多版本 API 接口

第一次在博客写分享,请多多捧场,如有歧义请多多包含!

因为业务需求发展需要,所以API接口的变更升级是必不可少的事情,而原有的接口是不可能马上停止使用的。例如:Login接口为例,1.0版本之返回用户的基本信息,而2.0版本的迭代下,要把用户祖宗十八代信息都要返回到客户端,这时候1.0 vs 2.0版本的返回信息有一点信息上的差异,如果在不进行版本控制的情况下,在原1.0的版本下优化,那么会出现一个比较严重的问题,如果还有在使用原1.0版本的终端岂不是GG了,所以如何能鱼与熊掌兼得,同时为1.0、2.0版本的终端考虑,所以一般常见的几种解决方案如下:

1、使用不同API名称(常见同时最为恶心)

这种是非常简单粗暴,非灵活处理方案,例如:1.0=Login 2.0=NewLogin 相对于来说是可以有效兼顾到各版本的终端用户,但是还是不够灵活,可配置度有点低。

1.0版本 https://****.com/Login

2.0版本 https://****.com/NewLogin

2、请求时带参数(这里就不详细说了)

1.0版本 https://****.com/Login?version=1

2.0版本 https://****.com/Login?version=1

3、Header中标识版本信息

终端调用API接口时,在Header中添加参数来表明请求的版本信息

4、在URL中标识版本信息

1.0版本 https://****.com/v1/Login

2.0版本 https://****.com/v2/Login

这里主要介绍的是第四种方案的项目搭建(网上有很多类似的文章描述)

1、建立web api项目

2、NuGet集成以下组件

SwashBuckle.AspNetCore 4.0.1

Microsoft.AspNetCore.Mvc.Versioning 3.1.1

Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer 3.1.0

Microsoft.Extensions.PlatformAbstractions1.1.0 (选择性集成,如果不需要API XMl文档生成的可以去除)

以上组件的描述、作用请各位google、baidu下去了解,这里不详细说明了

3、项目、代码上的设置/改动

在Startup->ConfigureServices方法中添加以下代码

       services.AddApiVersioning((o) =>
            {
                o.ReportApiVersions = true;//可选配置,设置为true时,header返回版本信息
                o.DefaultApiVersion = new ApiVersion(1, 0);//默认版本,请求未指明版本的求默认认执行版本1.0的API
                o.AssumeDefaultVersionWhenUnspecified = true;//是否启用未指明版本API,指向默认版本
            }).AddVersionedApiExplorer(option =>
            {
                option.GroupNameFormat = "‘v‘VVVV";//api组名格式
                option.AssumeDefaultVersionWhenUnspecified = true;//是否提供API版本服务
            }).AddSwaggerGen((s) =>
            {
                //填充UI内容
                var provider = services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>();
                foreach (var description in provider.ApiVersionDescriptions)
                {
                    s.SwaggerDoc(description.GroupName,
                         new Info()
                         {
                             Title = $"体检微服务接口 v{description.ApiVersion}",
                             Version = description.ApiVersion.ToString(),
                             Description = "微服务框架-切换版本请点右上角版本切换",
                             Contact = new Contact() { Name = "荣少(黎更荣) WeChat:186***** QQ:157537648", Email = "*******@hotmail.com" }
                         }
                    );
                }
                //生成API XML文档
                var basePath = PlatformServices.Default.Application.ApplicationBasePath;
                var xmlPath = Path.Combine(basePath, typeof(Startup).GetTypeInfo().Assembly.GetName().Name + ".xml");
                s.IncludeXmlComments(xmlPath);
            });

以上代码其中option.GroupNameFormat = "‘v‘VVVV";//api组名格式,各位可以尝试玩玩~~~~

在Startup->Configure方法中添加以下代码

            app.UseSwagger().UseSwaggerUI((o) =>
            {
                foreach (var description in provider.ApiVersionDescriptions)
                {
                    o.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
                }
            });

其中在Startup->Configure方法中缺少了IApiVersionDescriptionProvider provider参数,自己手动补上即可

//项目自动生成的版本
public void Configure(IApplicationBuilder app, IHostingEnvironment env)

//参数补上后的版本
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApiVersionDescriptionProvider provider)

以上配置基本上算时完成了,那么Web Api要怎么写法呢?

在WebApi项目中Controllers下建立v1、v2俩个文件夹

namespace WebApplication1.Controllers.v1
{
    [ApiVersion("1.0")]
    [Route("api/v{version:apiVersion}/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "v1", "v1" };
        }
    }
}
namespace WebApplication1.Controllers.v2
{
    [ApiVersion("2.0")]
    [Route("api/v{version:apiVersion}/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "v2", "v2" };
        }
    }
}

这里的路由设置了配置的标签{version:apiVersion},其中ApiVersion中有各类的属性字段,例如:弃用(不代表停用,就好像巨硬上已经过时的方法)该版本API-ApiVersion("1.0", Deprecated = true)],该[ApiVersionNeutral]标签就是表明停用,不需要该版本。

配置完成后,可以直接用url访问不同版本的接口地址:

https://localhost:44383/api/v1/Values

https://localhost:44383/api/v2/Values

最后的配置,因为项目默认启动的是api/Values接口地址,需要修改项目Properties->launchSettings.json

最终运行效果如下:

如果是对您有帮助,而您又比较慷概的请微信打赏下(后续回有更多的分享):

原文地址:https://www.cnblogs.com/vcode/p/10225410.html

时间: 2024-11-10 07:06:03

ASP.NET Core 3.0 实战:构建多版本 API 接口的相关文章

ASP.NET Core 1.0 开发记录

参考页面: http://www.yuanjiaocheng.net/ASPNET-CORE/first.html http://www.yuanjiaocheng.net/ASPNET-CORE/asp-net-core-overview.html http://www.yuanjiaocheng.net/ASPNET-CORE/asp.net-core-environment.html http://www.yuanjiaocheng.net/ASPNET-CORE/newproject.h

Asp.Net Core 2.0 项目实战(6)Redis配置、封装帮助类RedisHelper及使用实例

本文目录 1. 摘要 2. Redis配置 3. RedisHelper 4.使用实例 5. 总结 1.  摘要 由于內存存取速度远高于磁盘读取的特性,为了程序效率提高性能,通常会把常用的不常变动的数据存储在系统内存中,提升数据读取的速度,在C#下常见的内存操作有微软自带的内存处理.分布式缓存Memcached以及Redis,这里我们介绍Redis分布式缓存,另外两种缓存处理参考<Asp.Net Core 2.0 项目实战(8)Core下缓存操作.序列化操作.JSON操作等Helper集合类>

ASP.NET Core 2.0 MVC项目实战

 一.前言 毕业后入职现在的公司快有一个月了,公司主要的产品用的是C/S架构,再加上自己现在还在学习维护很老的delphi项目,还是有很多不情愿的.之前实习时主要是做.NET的B/S架构的项目,主要还是用的那种传统的开发模式,只有一个项目用到了Web API,自己负责后端的接口功能实现.既然现在没办法改变现状,那就先改变自己吧.定了个计划,下班后慢慢的开始学习ASP.NET Core Web API和Vue,准备从前端到后端自己写一个小项目玩玩,毕竟代码这个东西,时间长了是会忘的.       

说说ASP.Net Core 2.0中的Razor Page

随着.net core2.0的发布,我们可以创建2.0的web应用了.2.0中新东西的出现,会让我们忘记老的东西,他就是Razor Page.下面的这篇博客将会介绍ASP.Net Core 2.0中的Razor Page. 在ASP.Net Core 2.0新特点之一就是支持Razor Page.今天的Razor Page是ASP.Net Core MVC中的一个子集.ASP.Net Core MVC 支持Razor Page意味着Razor Page应用从技术上来说就是MVC应用,同时Razo

【ASP.NET Core分布式项目实战】(一)IdentityServer4登录中心、oauth密码模式identity server4实现

原文:[ASP.NET Core分布式项目实战](一)IdentityServer4登录中心.oauth密码模式identity server4实现 本博客根据http://video.jessetalk.cn/my/course/5视频整理 资料 OAuth2 流程:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 博客园晓晨的关于identityServer4的中文文档地址: http://www.cnblogs.com/stulzq

丙申年把真假美猴王囚禁在容器中跑 ASP.NET Core 1.0

丙申年把真假美猴王囚禁在容器中跑 ASP.NET Core 1.0? 警告 您当前查看的页面是未经授权的转载! 如果当前版本排版错误,请前往查看最新版本:http://www.cnblogs.com/qin-nz/p/aspnetcore-run-on-mono-in-year-of-monkey.html 提示 更新时间:2016年02月07日. 各位程序媛/程序猿们,猴年快乐. 相信不少媛/猿都是被标题吸引来的,那我我先解释下标题. 提示 本文是一篇半科普文,不对技术细节进行深入探究. 标题

ASP.NET Core 1.0

跨平台运行ASP.NET Core 1.0 前言 首先提一下微软更名后的叫法: ASP.NET 5 更名为 ASP.NET Core 1.0 .NET Core 更名为 .NET Core 1.0 Entity Framework 7 更名为 Entity Framework Core 1.0 或者简称 EF Core 1.0 现在伴随着ASP.NET Core 1.0 RC2版的更新速度,许多官方文档都跟不上,还停留在RC1版的使用方式上(RC1版是继Beta版之后第一个发布的稳定版本).RC

.NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0简介

.NET Core 1.0.ASP.NET Core 1.0和EF Core 1.0简介 英文原文:Reintroducing .NET Core 1.0, ASP.NET Core 1.0, and EF Core 1.0 新版本的 ASP.NET 和 Entity Framework 有一个严重的问题,就是它们同以前的版本不兼容.这不只是行为或 API 稍有差异的事,而基本上是进行了完全的重写,去掉了大量的功能. 因此,目前人们认为,将这些框架称为 ASP.NET 5.0 和 Entity

ASP.NET 5 已死 - 隆重介绍 ASP.NET Core 1.0 和 .NET Core 1.0

还没正式登场就死了?不能怪我标题党,是大神Scott在他博客上这么说的,我只是翻译了一下. 在1月20号最新的ASP.NET Community Standup视频中,微软aspnet开发组的大帅哥 大面·爱德华兹(Damian Edwards)聊了聊在未来版本RC2将要进行的重命名工作. 然而由于我听力太渣,只能听个大概,好在Scott Hanselman在博客中发表了一篇文章把这个事情解释了一下. 我粗暴翻译了一下,给大家看看,难免有错,还望指正. 博客英文原文地址:ASP.NET 5 is