• .Net6 Api 里使用版本控制(Versioning)


    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/'像这样的路由看着有点儿不舒服

    [Route("api/v{v:apiVersion}/employee")]
    1
    下面用postman:

    http://localhost:5000/api/v1.0/employee/
    http://localhost:5000/api/v1/employee/
    http://localhost:5000/api/v2.0/employee/
    http://localhost:5000/api/v2/employee/


    基于HTTP 请求头的操作
    此时需要修个startup.cs里的配置,如下图

    此处绿色里的请求头key可以随便设置,只需要在请求时,请求头填写对就行
    推荐使用 ·x-api-XXX· 开头;

    修改控制器里的路由规则,减所有控制器路由改成 【基于请求参数】里的格式 例: [Route("api/employee")]


    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Versioning;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;


    namespace WebApplication1
    {
    public class Startup
    {
    public Startup(IConfiguration configuration)
    {
    Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
    services.AddControllers();
    services.AddApiVersioning(x =>
    {
    x.DefaultApiVersion = new ApiVersion(1, 0);
    x.AssumeDefaultVersionWhenUnspecified = true;
    x.ReportApiVersions = true;
    x.ApiVersionReader = new HeaderApiVersionReader("x-api-version");
    });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
    if (env.IsDevelopment())
    {
    app.UseDeveloperExceptionPage();
    }

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
    endpoints.MapControllers();
    });
    }
    }
    }


    运行如下图,所示,

    如果输入,默认就是返回第一个版本,这里在ConfigureServices里设置了的

    原文链接:https://blog.csdn.net/u010279498/article/details/107637682

  • 相关阅读:
    dev 调用汉化资源
    GridViewDataHyperLinkColumn 显示与内容分离
    gmail 邮箱找回方法
    C# 拼接 in 查询字符串
    asp.net ajax
    解决vmware 因为网络问题而引起的异常
    从改工具到改模型
    Orchard源码:EventBus&EventHandler
    AutoResetEvent和ManualResetEvent理解
    缓存设计
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/16646027.html
Copyright © 2020-2023  润新知