赣州论坛:Asp.Net.Core WebApi 版本控制

admin 2周前 (10-10) 科技 56 2

前言

在后端Api的开发历程中,无法制止的会遇到接口迭代的历程,若何保证新老接口的共存和接口的向前的兼容呢,这时刻就需要对Api举行版本的控制,那若何优雅的控制Api的版本呢?

最先

Microsoft.AspNetCore.MVc.Versioning 是一个微软方推出的一个用于治理Api版本的包,设置简朴,功效壮大。 github地址.

新建一个WebApi项目并通过下令引用包。

Install-Package Microsoft.AspNetCore.Mvc.Versioning

最新版本已经支持Core3.1

项目结构如下

StartupConfIGureServices 中增添一下设置。

services.AddApiVersioning(options =>
{
    options.ReportApiVersions = true; 
    options.AssumeDefaultVersionWhenUnspecified = true; 
    options.DefaultApiVersion = new ApiVersion(1, 0); 
});
  • ReportApiVersions:是否在请求头中返回受支持的版本信息。
  • AssumeDefaultVersionWhenUnspecified:请求没有指明版本的情况下是否使用默认的版本。
  • DefaultApiVersion:默认的版本号。

通过QueryString举行版本控制

划分在两个差别的Controller中添加一个获取版本信息的接口

namespace version.Controllers.v1
{
    [ApiVersion("1.0")]
    [ApiController]
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        [HttpGet("version")]
        public string Version() => (HttPConteXt.GetRequestedApiVersion().ToString());
    }
}
namespace version.Controllers.v2
{
    [ApiVersion("2.0")]
    [ApiController]
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        [HttpGet("version")]
        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());
    }
}

HttpContext.GetRequestedApiVersion().ToString() 是用于获取请求接口的版本信息。

我们通过postman来请求这两个接口当我们没有给到详细请求哪个版本的时刻会凭据在ConfigureServices中设置的默认版本去执行。

指定版本请求效果

赣州论坛:Asp.Net.Core WebApi 版本控制  第1张

赣州论坛:Asp.Net.Core WebApi 版本控制  第2张

在响应头中会显示当前支持的所有的Api版本

赣州论坛:Asp.Net.Core WebApi 版本控制  第3张

通过URL Path举行版本控制

一样平常在Api开发中不会去QueryString的方式去举行版本控制,而是使用URL路径段的方式来控制版本。

修改两个Controller中的代码如下。

namespace version.Controllers.v1
{
    [ApiVersion("1.0")]
    [ApiController]
    [Route("api/v{version:ApiVersion}/[controller]")]
    public class ValuesController : Controller
    {
        [HttpGet("version")]
        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());
    }
}
namespace version.Controllers.v2
{
    [ApiVersion("2.0")]
    [ApiController]
    [Route("api/v{version:ApiVersion}/[controller]")]
    public class ValuesController : Controller
    {
        [HttpGet("version")]
        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());
    }
}

通过postman举行测试

赣州论坛:Asp.Net.Core WebApi 版本控制  第4张
赣州论坛:Asp.Net.Core WebApi 版本控制  第5张
赣州论坛:Asp.Net.Core WebApi 版本控制  第6张

可以看到当我们使用指定的版本是可以正常接见的时刻,然则若是我们去掉了Api版本号就会抛出404,并不能像QueryString一样挪用默认的Api版本,由于URL Path的方式不允许隐式匹配设置的默认Api版本。以是必须声名所有的Api版本。且在请求Api同时必须带上Api版本号。

通过Media Type举行版本控制

我们还可以使用content-type来实现版本的控制

修改ConfigureServices中的设置

services.AddApiVersioning(options =>
{
    options.ApiVersionReader = new MediaTypeApiVersionReader();
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.ApiVersionSelector = new CurrentImplementationApiVersionSelector(options);

});

CurrentImplementationApiVersionSelector 若是没有在content-type中通报Api版本好,将默认匹配最新的Api版本

划分修改两个Controller

namespace version.Controllers.v1
{
    [ApiVersion("1.0")]
    [ApiController]
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        [HttpGet("version")]
        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());
    }
}
namespace version.Controllers.v2
{
    [ApiVersion("2.0")]
    [ApiController]
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        [HttpGet("version")]
        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());
    }
}

使用Postman测试

赣州论坛:Asp.Net.Core WebApi 版本控制  第7张

通过自定义Headers举行版本控制

修改ConfigureServices中的设置

services.AdDControllers();
services.AddApiVersioning(options =>
{
    options.ReportApiVersions = true;
    options.ApiVersionReader = new HeaderApiVersionReader("api_version");
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.DefaultApiVersion = new ApiVersion(1, 0);
});

api_version 是你Headers中Key的名字。

使用Postman测试
赣州论坛:Asp.Net.Core WebApi 版本控制  第8张

特征

当哪个Api版本不在更新,就需要弃用掉这个版本。当Deprecated值为true时说明该Api版本已经已经弃用,然则弃用不代表不能请求。只是会在响应头中见告次版本已经已经弃用。

namespace version.Controllers.v1
{
    [ApiVersion("1.0",Deprecated= true)]
    [ApiController]
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        [HttpGet("version")]
        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());
    }
}

赣州论坛:Asp.Net.Core WebApi 版本控制  第9张

项目总有一些功效是不需要版本的控制,以是我们希望它不受版本控制。可以添加[ApiVersionNeutral]特征使Api支持版本控制。

namespace version.Controllers.v1
{
    [ApiVersionNeutral]
    [ApiController]
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        [HttpGet("version")]
        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());
    }
}

MapToApiVersion 可以将单个Api归类于任何版本。在一个Controller中可以存在多个版本的Api。我们可以配合Deprecated来天真的控制我们的Api。

namespace version.Controllers.v1
{
    [ApiVersion("3.0")]
    [ApiVersion("1.0",Deprecated= true)]
    [ApiController]
    [Route("api/v{version:ApiVersion}/[controller]")]
    public class ValuesController : Controller
    {
        [HttpGet("version"), MapToApiVersion("1.0")]
        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());

        [HttpGet("version3"), MapToApiVersion("3.0")]
        public string Version3() => (HttpContext.GetRequestedApiVersion().ToString());
    }
}

通过postman测试一下。

赣州论坛:Asp.Net.Core WebApi 版本控制  第10张

总结

可以看到Microsoft.AspNetCore.Mvc.Versioning功效还能壮大的,基本知足了大部分的需求,另有一些功效可能没有在本文中涉及到,可以去这里.翻阅。

,

申博SuNBet

申博Sunbet www.xzsxzxx.cn是Sunbet娱乐的官方网站,是亚洲唯一的Sunbet。公司业务主要范围:Sunbet、Sunbet、sunbet娱乐等。

Sunbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:赣州论坛:Asp.Net.Core WebApi 版本控制

网友评论

  • (*)

最新评论

标签列表

    文章归档

      站点信息

      • 文章总数:653
      • 页面总数:0
      • 分类总数:8
      • 标签总数:1146
      • 评论总数:283
      • 浏览总数:17261