文章目录
- [路由与终结点:如何规划好Web Api](#路由与终结点:如何规划好Web Api)
-
- [1. 路由](#1. 路由)
-
- [1.1 路由映射](#1.1 路由映射)
- [1.2 路由注册方式](#1.2 路由注册方式)
- [1.3 路由约束](#1.3 路由约束)
- [总结: Web Api定义](#总结: Web Api定义)
路由与终结点:如何规划好Web Api
1. 路由
1.1 路由映射
路由系统核心作用是指URL和应用程序Controller的对应关系的一种映射
这种映射的作用:
1.把URL映射到对应的Controller的action上
2.根据Controller和action的名字生成URL
1.2 路由注册方式
- 路由模板的方式 ⇒ 传统方式,可作为MVC页面的Web配置
- RouteAttribute方式 ⇒ 更适合Web Api
1.3 路由约束
路由约束指的是路由如何匹配
- 类型约束
- 范围约束
- 正则约束
- 是否必选
- 自定义IRouteConstraint
根据路由信息URL生成地址的类
-
LinkGenerator
-
IUrlHelper
/// <summary> /// 类型约束 /// </summary> /// <param name="id">必须可以转long</param> /// <returns></returns> [HttpGet("{id:MyRouteConstraint}")] public bool OrderExist(object id) { return true; } /// <summary> /// 范围约束 /// </summary> /// <param name="id"></param> /// <returns></returns> [HttpGet("{id:max(20)}")] public bool Max(long id) { return true; } /// <summary> /// 是否必选 /// </summary> /// <param name="name"></param> /// <returns></returns> [HttpGet("{name:required}")] public bool Reque(string name) { return true; } /// <summary> /// 正则约束 /// </summary> /// <param name="number"></param> /// <returns></returns> [HttpGet("{number:regex(^\\d{{3}}$)}")] public bool Bumber(string number) { return true; }
// 自定义IRouteConstraint
// 自定义路由约束类
public class MyRouteConstraint : IRouteConstraint
{
public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
{
if (RouteDirection.IncomingRequest == routeDirection)
{
var v= values[routeKey];
if (long.TryParse(v.ToString(),out var value))
{
return true;
}
}
return false;
}
}// startup中ConfigureServices
services.AddRouting(options =>
{
options.ConstraintMap.Add("MyRouteConstraint", typeof(MyRouteConstraint));
});[HttpGet("{id:MyRouteConstraint}")]
public bool OrderExist([FromRoute]string id)
{
return true;
}
LinkGenerator生成Url
[HttpGet("{id:max(20)}")]
public bool Max([FromRoute] long id, [FromServices] LinkGenerator linkGenerator)
{
var a = linkGenerator.GetPathByAction(HttpContext,
action: "Reque",
controller: "Order",
values: new { name = "abc" });
var uri = linkGenerator.GetUriByAction(HttpContext,
action: "Reque",
controller: "Order",
values: new { name = "abc" });
return true;
}
总结: Web Api定义
- Restful不是必须的
- 约定好API的表达契约
- 将API约束在特定目录下,如/api/
- 使用ObsoleteAttribute标记即将废弃的API