【问题标题】:How is REST api versioning implemented technically? [closed]REST api 版本控制在技术上是如何实现的? [关闭]
【发布时间】:2019-12-20 08:09:47
【问题描述】:

我正在开发一个需要重构的 REST api。这将是一个重大更改,因此原始 api 将被制作为 v1,新的重构 api 将被称为 v2。版本控制将在 url 级别实现。

我想从技术上了解如何解决这个问题。我应该创建项目的副本并进行更改,还是应该在同一个项目上进行更改,然后如何将项目公开为单独的版本?

【问题讨论】:

  • 你在使用基于.NET Core的api吗?

标签: c# rest asp.net-web-api webapi


【解决方案1】:

您可以像下面那样实现版本控制。在Startup.csConfigureServices() 中,您可以执行以下操作:

services.AddApiVersioning(option =>
{
    option.ReportApiVersions = true;
    option.AssumeDefaultVersionWhenUnspecified = true;
    option.DefaultApiVersion = new ApiVersion(1, 0);
    option.AssumeDefaultVersionWhenUnspecified = true;
});

现在,您可以拥有多个版本的控制器,如下所示:

namespace APIVersions.Controllers
{
    [ApiVersion("1.0")]
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        [HttpGet]
        public IActionResult Get() => Ok(new string[] { "value1" });
    }
}

版本 2:

namespace APIVersions.Controllers3
{
    [ApiVersion("2.0")]
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        [HttpGet]
        public IActionResult Get() => Ok(new string[] { "value1" });
    }
}

现在,在您的浏览器中,您可以使用?api-version=2,它将进入第二个版本。

另外,您可以这样做:

namespace APIVersions.Controllers
{
    [ApiVersion("1.0")]
    [ApiVersion("2.0")]
    [Route("api/v{version:apiVersion}/[controller]")]
    public class ValuesController : Controller
    {
        [HttpGet]
        public IActionResult Get() => Ok(new string[] { "value1" });

        [HttpGet, MapToApiVersion("2.0")]
        public IActionResult GetV3() => Ok(new string[] { "value3" });
    }
}

这样,您可以调用所需的 Get 方法。

参考:https://www.talkingdotnet.com/support-multiple-versions-of-asp-net-core-web-api/

【讨论】:

    【解决方案2】:

    重构后,两个 REST api 端点都必须可用。它们都必须存在于您的代码中,因此只需在现有控制器中添加另一个控制器端点,例如

        [HttpGet]
        [Route("v1/ElectricityAll")]
        public IActionResult ElBlockedGetV1()
        {
            return new JsonResult(_context.ElBlockeds.ToList());
        }
    
        [HttpGet]
        [Route("v2/ElectricityAll")]
        public IActionResult ElBlockedGetV2()
        {
            return new JsonResult(_context.ElBlockeds.Where(x=>x.Status == Status.Active).ToList());
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-14
      • 2012-05-31
      • 2013-04-10
      • 2023-01-28
      • 2018-09-30
      • 2013-07-14
      • 2017-03-18
      • 1970-01-01
      相关资源
      最近更新 更多