有四种基本方法来版本化 RESTful 方式 -
-
URI 路径 此方法采用以下形式:
http://api/v2/任务/{TaskId}
-
URI 参数 此方法采用以下形式:
http://api/任务/{任务ID}?v=2
-
内容协商 这是在 HTTP 标头中完成的。
内容类型:application/vnd.taskManagerApp.v2.param.json
-
请求标头 这也是在 HTTP 标头中完成的。
x-taskManagerApp-版本:2
我个人喜欢第一种方法。你可以阅读Mike Wasson 的 ASP.NET Web API:使用命名空间对 Web API 进行版本控制.
许多人修改了 Mike Wasson 的原始来源。我喜欢其中使用的一个ASP.NET Web API 2 书籍,作者:Jamie Kurtz、Brian Wortman.
由于它有太多移动部件,我创建了GitHub 上的示例项目.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{version}/{controller}",
defaults: new { version = "v2" }
);
config.Routes.MapHttpRoute(
name: "DefaultApiWithId",
routeTemplate: "api/{version}/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
然后,你添加Api版本约束
public class ApiVersionConstraint : IHttpRouteConstraint
{
public ApiVersionConstraint(string allowedVersion)
{
AllowedVersion = allowedVersion.ToLowerInvariant();
}
public string AllowedVersion { get; private set; }
public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName,
IDictionary<string, object> values, HttpRouteDirection routeDirection)
{
object value;
if (values.TryGetValue(parameterName, out value) && value != null)
{
return AllowedVersion.Equals(value.ToString().ToLowerInvariant());
}
return false;
}
}
Usage
你只需放置路由前缀在控制器上,你就完成了。
[RoutePrefix("api/{apiVersion:apiVersionConstraint(v1)}/values")]
public class ValuesController : ApiController
{
// GET api/v1/values
[Route("")]
public IEnumerable<string> Get()
{
return new string[] { "v1-value1", "v1-value2" };
}
// GET api/v1/values/5
[Route("{id}")]
public string Get(int id)
{
return "v1-value-" + id;
}
}