如何在/api/v1上实现版本化的WebApi
本文关键字:版本 WebApi 实现 v1 api | 更新日期: 2023-09-27 17:54:00
我想在现有的MVC项目中构建一个版本化的WebApi,以便我的url可以
/api/v1/account
/api/v2/account
我现在不使用区域,但经过一些研究,我认为这可能对我有用,但显然你不能嵌套Areas
(我目前使用MVC4,但可以升级到5)。
我怎样才能最好地做到这一点?
我最后用了
有两种方法通过Web API实现版本控制
方法1:/api/accountv1/
/api/accountv2/
我在API版本控制中发现的最简单的方法是创建一个相同的控制器"AccountV1Controller",并将其命名为"AccountV2Controller",注意控制器名称中的后缀V1和V2,我们将根据此部分选择适当的控制器基于API版本。
方法二:/api/v1/account
/api/v2/account
或者你可以使用路由来获得相同的行为
config.Routes.MapHttpRoute(
name: "1-0Api",
routeTemplate: "api/v1/Account/{id}",
defaults: new { controller = "AccountV1", id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "2-0Api",
routeTemplate: "api/v2/Account/{id}",
defaults: new { controller = "AccountV2", id = RouteParameter.Optional }
);
从这里取
这里有两种方法不需要你有2个独立的Controller类。
请求头
一个推荐的版本控制设计是使用请求头而不是URL参数。
if (Request.Headers["API Version"] == "2")
{
return Version2Code();
}
return Version1Code();
使用一个routecontion
你也可以使用路由约束:
config.Routes.MapHttpRoute(
name: "versionedApi",
routeTemplate: "api/{version}/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new {version = @"^[vV]'d+$"}
);
版本将成为一个路由函数参数,就像id一样。
public class AccountController: Controller {
public class ActionResult Index(object id, string version)
{
if (string.Equals(version, "v2", StringComparison.OrdinalIgnoreCase))
{
return Version2Code();
}
return Version1Code();
}
}
另外,查看Web API 2属性路由
同样,如果你要升级到Mvc 5和WebAPI 2,这里有一些关于如何使用属性路由的例子http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2