XIKEW.COM - 实用教程 - 路由入门及逻辑 - 实用教程,路由,restful,webapi - LinkCoreX无需额外对路由进行配置,在编码的过程中一键智能绑定轻松实现RESTful,当然你也可以根据自己的喜好不完全按照RESTful的规则来设计自己的路由。

路由入门及逻辑
LINKCORE NETCORE 框架 9/5/2024 9:55:17 PM 阅读:2

LinkCoreX无需额外对路由进行配置,在编码的过程中一键智能绑定轻松实现RESTful,当然你也可以根据自己的喜好不完全按照RESTful的规则来设计自己的路由。 关键字:路由,restful,webapi [[toc]]

基础功能

在上一章 Runner.cs 代码中 Builder.AddRouter 作用就是手动注册路由,但这种简单粗暴的方式并不适用于大型项目的开发,所以我们推荐使用 自动注册路由

自动注册路由

public void OnStart()
{
    //执行这个方法会自动解析路由,才能使路由生效
    Builder.AutoMaper();
}

::: warning 自动注册路由不像手动那样直接指定静态或非静态方法,让路由方法需要三个必要条件才能生效

  1. 所在 需要继承 ApiController
  2. public 访问权限
  3. 返回值是 IActionResult

其实 2 和 3 也是手动注册方法的必要条件:grinning: :::

::: warning 手动注册和自动注册如果同时启用,使用相同的路径会覆盖 ::: ::: tip 自动注册路由对开发提供了非常多的便利,但在面对一个非常简单的需求时手动注册路由却有着无以伦比的轻便高效,这就是自动路由这么强大也没有放弃手动注册的原因。 :::

Hello LinkCoreX

终于来到 Say Hello 环节,举例我们在项目下创建了一个V1的目录,并在目录下创建一个Index.cs

using LinkCore.Interface;
using LinkCore.Interface.Router;

namespace DemoPlugin.V1
{
    class Index: ApiController
    {
        public IActionResult GetHello()
        {
            return new StringActionResult() { Data = "Hello LinkCoreX!!"};
        }
    }
}

这样我们就可以通过浏览器访问地址 http://{地址}:{端口}/DemoPlugin/V1/Index/Hello 浏览器就会成功输出 Hello LinkCoreX!!

Restful

可以根据前端请求的 Method 来区分方法

//通过Post方法访问
public IActionResult PostHello()
{
    return new StringActionResult() { Data = "Hello LinkCoreX!!"};
}
//通过Put方法访问
public IActionResult PutHello()
{
    return new StringActionResult() { Data = "Hello LinkCoreX!!"};
}

::: tip 关于 Access-Control-Allow-Methods LinkCoreX 框架默认允许了大部分 MethodAccess-Control-Allow-Methods 默认为 POST, GET, OPTIONS, DELETE, PUT, PATCH :::

空方法

希望访问 /DemoPlugin/V1/Index/ 地址来接收,你只要使用只有 Method 作为方法名

//通过Get来访问
public IActionResult Get()
{
    return new StringActionResult() { Data = "Hello LinkCoreX!!"};
}

动态路由

希望访问 /DemoPlugin/V1/Index/变量 使用一个统一接口接收并且希望根据变量进行逻辑处理

public IActionResult Empty()
{
    return new StringActionResult() { Data = Requester.Request.RawUrl };
}

::: tip 实际开发中可以对 RawUrl 进行字符串拆分提取变量,然后进一步进行逻辑处理 :::

路由传参

手动路由的参数接收只能从 request 参数中获取,点击这里了解更多 但自动路由接收前端参数的方法也很简单

public IActionResult Empty()
{
    // 获取 Body 字符串
    var body = RequestReadBody();

    // 获取 URL 参数
    var query = RequestReadQuery<string>();
    var model = RequestReadQuery<TestModel>();

    // 获取Header参数
    var token = RequestReadHeader("Token");

    // Code Todo...
}

大多情况我们都会协定前端参数,比如 /DemoPlugin/V1/Index/Detail?id=1


namespace DemoPlugin.V1
{
    class Index: ApiController
    {
        public IActionResult GetDetail(string id)
        {
            // Code Todo...
        }
    }
}

::: warning Method 空路由方法、 Empty 动态路由方法是无参方法 :::

高阶路由

ApiController

ApiController 是所有路由的基类,通过继承它实现前端的路由访问和后台数据返回。 它继承了 LinkCore.Interface.Router.IHttpRouter 接口类

数据流转逻辑

了解数据流转的逻辑,可以扩宽开发者对项目的想象空间,且只需在路由类中重写函数

flowchart TB
前端通过接口或浏览器访问路由地址 --> Builder --> C3{模式监测} 
C3 -- 自动 --> C1{检查路由}
C1 -- 正确 --> B[BeforeAction] --> R[路由方法] --> A[AfterAction] --> O[OutPut] --> END[返回给前端]
C1 -- 错误 --> C2{检查Empty方法}
C2 -- 已定义 --> E[Empty] --> B
C2 -- 未定义 --> Err[报错] --> END
C3 -- 手动 --> O
C3 -- 未知(路径无法判断) --> Err

::: tip BeforeActionAfterAction 是无参函数,也就说只能进行全局变量的逻辑补充,如果需要对路由方法返回结果进行处理,可以使用 OutPut(IActionResult) 来进行加工。 :::

Requester

每一个路由类都要继承 ApiController 所以每一个路由类都有 Requester 对象属性,它继承了 IRequest 的接口,插件可以访问这个接口来掌握前端请求的一些数据情况。

Requester 预留了 NetCore 底层框架级别的 HttpListenerRequest 实例化对象

HttpListenerRequest req = Requester.Request;

实际上也就是我们手动注册时路由方法接收的 request 参数

static public IActionResult Hello(HttpListenerRequest request) 
{
    return new StringActionResult() { Data = "Hello LinkCoreX!!"};
}