【NetCore】10-路由定义

文章目录

  • [路由与终结点:如何规划好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
相关推荐
码事漫谈5 小时前
骂AI,会让它做得更好吗?
后端
“AI国潮设计-小江”5 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
程序喵大人5 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
陈随易6 小时前
bm2,Node.js 与 Bun 项目部署新选择
前端·后端·程序员
架构技术专栏7 小时前
AI Agent 框架怎么选:从一次制度查询拆出技术边界
后端·面试
sunshine22 girl7 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
菜鸟~noob2338 小时前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
惊讶的猫9 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python
cmpxr_9 小时前
【MicroPython】如何刷新ESP8266的固件
开发语言·micropython
搭贝9 小时前
上厕所的时间搭好一套系统:AI自动生成实测
开发语言·人工智能·低代码·ai·php·搭贝