如何在/api/v1上实现版本化的WebApi

本文关键字:版本 WebApi 实现 v1 api | 更新日期: 2023-09-27 17:54:00

我想在现有的MVC项目中构建一个版本化的WebApi,以便我的url可以

/api/v1/account
/api/v2/account

我现在不使用区域,但经过一些研究,我认为这可能对我有用,但显然你不能嵌套Areas(我目前使用MVC4,但可以升级到5)。

我怎样才能最好地做到这一点?

我最后用了

如何在/api/v1上实现版本化的WebApi

两种方法通过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