REST api 版本控制在技术上是如何实现的? [关闭]
Posted
技术标签:
【中文标题】REST api 版本控制在技术上是如何实现的? [关闭]【英文标题】:How is REST api versioning implemented technically? [closed] 【发布时间】:2019-12-20 08:09:47 【问题描述】:我正在开发一个需要重构的 REST api。这将是一个重大更改,因此原始 api 将被制作为 v1,新的重构 api 将被称为 v2。版本控制将在 url 级别实现。
我想从技术上了解如何解决这个问题。我应该创建项目的副本并进行更改,还是应该在同一个项目上进行更改,然后如何将项目公开为单独的版本?
【问题讨论】:
你在使用基于.NET Core
的api吗?
【参考方案1】:
您可以像下面那样实现版本控制。在Startup.cs
、ConfigureServices()
中,您可以执行以下操作:
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/vversion: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());
【讨论】:
以上是关于REST api 版本控制在技术上是如何实现的? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot REST API 版本控制的自定义标头方法