zoukankan      html  css  js  c++  java
  • 支持多个版本的ASP.NET Core Web API

    基本配置及说明

    版本控制有助于及时推出功能,而不会破坏现有系统。 它还可以帮助为选定的客户提供额外的功能。 API版本可以通过不同的方式完成,例如在URL中添加版本或通过自定义标头和通过Accept-Header作为查询字符串参数。 在这篇文章中,我们来看看如何支持多版本的ASP.NET Core Web API

    创建一个ASP.NET Core Web API应用程序。通过 NuGet 安装此软件包:Microsoft.AspNetCore.Mvc.Versioning,打开Startup.cs,修改ConfigureServices方法,代码如下:

    [源码] view plain
    1. public void ConfigureServices(IServiceCollection services)  
    2. {  
    3.     services.AddMvc();  
    4.     services.AddApiVersioning(option =>  
    5.     {  
    6.         option.ReportApiVersions = true;  
    7.         option.AssumeDefaultVersionWhenUnspecified = true;  
    8.         option.DefaultApiVersion = new ApiVersion(1, 0);  
    9.     });  
    10. }  

    你可以看到配置了3个不同的选项:

    ReportAPIVersions :这是可选的。 但是当设置为true时,API会在响应头中返回受支持的版本信息。AssumeDefaultVersionWhenUnspecified :此选项将用于在没有版本的情况下提供请求。 假定的API版本默认为1.0DefaultApiVersion :此选项用于指定在请求中未指定任何版本时要使用的默认API版本。 这将默认版本为1.0

    这就是配置和设置。 现在我们将看到访问API版本的不同方法。

    Via Query String(通过查询字符串)

    打开Controller 类,然后用ApiVersion属性装饰控Controller类。 像下面这样,

    [源码] view plain
    1. namespace MultipleAPIVersions.Controllers  
    2. {  
    3.     [ApiVersion("1.0")]  
    4.     [Route("api/[controller]")]  
    5.     public class ValuesController : Controller  
    6.     {  
    7.         [HttpGet]  
    8.         public IActionResult Get() => Ok(new string[] { "value1" });  
    9.     }  
    10. }  

    以上版本被设置为1.0,你还可以设置API版本为2.0,为此你需要在不同命名空间中创建具有相同名称的另一个Controller类。 像下面这样,

    [源码] view plain
    1. namespace AspNetCoreWebApi.Controllers2  
    2. {  
    3.     [ApiVersion("2.0")]  
    4.     [Route("api/[controller]")]  
    5.     public class ValuesController : Controller  
    6.     {  
    7.         [HttpGet]  
    8.         public IActionResult Get() => Ok(new string[] { "value2" });  
    9.     }  
    10. }  

    现在去浏览器并访问控制器。 您应该看到API版本1.0控制器的输出,因为默认访问为1.0的版本。 现在在URL中附加api-version = 2,你应该看到API 2.0版控制器的输出。

    api res

    Via URL Path Segment(通过URL路径)

    查询字符串参数是有用的,但在长URL和其他查询字符串参数的情况下可能会很痛苦。 相反,更好的方法是在URL路径中添加版本。 像这样,

    api/v1/values api/v2/values

    所以要做到这一点,我们需要把版本放在route属性中:

    [源码] view plain
    1. namespace MultipleAPIVersions.Controllers  
    2. {  
    3.     [ApiVersion("1.0")]  
    4.     [Route("api/v{version:apiVersion}/[controller]")]  
    5.     public class ValuesController : Controller  
    6.     {  
    7.         [HttpGet]  
    8.         public IActionResult Get() => Ok(new string[] { "value1" });  
    9.     }  
    10. }  

    同样,您需要将路由参数更新到所有请求中。 通过此更改,API端点始终需要具有版本号。 您可以通过api/v1/values导航到版本1.0,要想访问2.0版本,更改URL中的版本号。 简单,看起来更干净

    api path

    Via HTTP Headers(通过HTTP头传递)

    在上述两种方法中,需要修改URL以支持版本控制。 但是,如果您希望您的API URL保持干净,那么API版本信息也可以通过附加HTTP头传递。 为了使其工作,您需要配置ApiVersionReader选项

    [源码] view plain
    1. services.AddApiVersioning(option =>  
    2. {  
    3.     option.ReportApiVersions = true;  
    4.     option.ApiVersionReader = new HeaderApiVersionReader("api-version");  
    5.     option.DefaultApiVersion = new ApiVersion(1, 0);  
    6.     option.AssumeDefaultVersionWhenUnspecified = true;  
    7. });  

    打开Postman添加header api-version测试

    test v1

    当您将2.0作为值提供给api-version时,它将调用2.0版Controller并返回输出

    test v2

    简单易用的设置。 但是,现在查询字符串参数(query string parameter)将无法正常工作。 设置header后,不能指定查询字符串参数(query string parameter)。 如果你希望支持,请使用ApiVersionReader.Combine

    [源码] view plain
    1. option.ApiVersionReader = ApiVersionReader.Combine  
    2.             (  
    3.                 new QueryStringApiVersionReader("api-version"),  
    4.                 new HeaderApiVersionReader("api-version")  
    5.             );  

    现在,查询字符串参数和header都支持
    请记住,我们还将ReportApiVersions设置为true,返回响应头中的版本信息。 见下图

    ReportApiVersions

    现在,让我们来看看另外几个选项

    MapToApiVersion

    MapToApiVersion 特性允许将单个API action 映射到任何版本。 换句话说,支持多个版本的单个Controller

    [源码] view plain
    1. namespace MultipleAPIVersions.Controllers  
    2. {  
    3.     [ApiVersion("1.0")]  
    4.     [ApiVersion("3.0")]  
    5.     [Route("api/v{version:apiVersion}/[controller]")]  
    6.     public class ValuesController : Controller  
    7.     {  
    8.         [HttpGet]  
    9.         public IActionResult Get() => Ok(new string[] { "value1" });  
    10.   
    11.         [HttpGet, MapToApiVersion("3.0")]  
    12.         public IActionResult GetV3() => Ok(new string[] { "value3" });  
    13.     }  
    14. }  

    MapToVer

    Deprecated(弃用)

    当支持多个API版本时,一些版本最终将被淘汰。 要想标明一个或多个API版将被弃用,只需将准备弃用的API版本标记。 这并不意味着不支持API版本,这些被标记的API仍然可以调用。 这只是让用户意识到以后版本将被废弃的一种方式
    [ApiVersion("1.0", Deprecated = true)]

    Deprecated

    ApiVersionNeutral(版本中立)

    ApiVersionNeutral特性定义该API是版本中立的。 这对于行为方式完全相同的API非常有用,不论是支持API版本的Controller还是不支持API版本的Controller。 因此,你可以添加ApiVersionNeutral特性以退出版本控制

    [源码] view plain
    1. [ApiVersionNeutral]  
    2. [RoutePrefix( "api/[controller]" )]  
    3. public class SharedController : Controller  
    4. {  
    5.     [HttpGet]  
    6.     public IActionResult Get() => Ok();  
    7. }  

    访问版本信息

    如果你想知道哪个版本的客户端正在尝试访问,那么你可以从中获取该信息:

    [源码] view plain
      1. public string Get() => HttpContext.GetRequestedApiVersion().ToString();  
  • 相关阅读:
    HDU 1022 Train Problem I
    HDU 1702 ACboy needs your help again!
    HDU 1294 Rooted Trees Problem
    HDU 1027 Ignatius and the Princess II
    HDU 3398 String
    HDU 1709 The Balance
    HDU 2152 Fruit
    HDU 1398 Square Coins
    HDU 3571 N-dimensional Sphere
    HDU 2451 Simple Addition Expression
  • 原文地址:https://www.cnblogs.com/jjg0519/p/7253594.html
Copyright © 2011-2022 走看看