跟着官网学ASP.NET Core 6.0之路由

跟着官网学ASP.NET Core 6.0之路由

路由是个啥东西?有啥用?官方说路由系统通过添加终结点,构建在中间件管道之上。路由负责匹配传入的 HTTP URL请求,然后将这些请求发送到应用的可执行终结点,那啥又是终结点啊?终结点代表应用的功能单元.整体看来,大概意思就是,当我们发起HTTP请求时,路由会负责匹配请求路径和HTTP的请求方法,然后执行我们注册好的实现方法。

注册路由

注册路由,一般通过WebApplication对象或者Route特性两种方式,WebApplication继承了IEndpointRouteBuilder接口,微软配置了EndpointRouteBuilderExtensions扩展类来注册路由

该扩展类为我们提供了分别对应HTTP请求方式的注册方法,
如果我们要注册一个GET请求的路由,则直接使用app.MapGet()方法

这里我们注册一个简单的路由app.MapGet("/hello", () => "Hello World!");,此时直接通过localhost:port/hello便可以访问到该路由

通过特性注册路由

这里,我们新建一个名为RouteController的控制器类,在我们通过VS新建一个WebApi的控制器时,模板会自动在Controller类为我们添加上[Route("api/[controller]")],该路由以为着我们需要通过/api/控制器名来访问该控制器,这时候,会根据HTTP的请求方式来匹配该路径下的方法

此时该类下面并没有相应规则的实际可执行方法,那么当我们直接访问/api/route,便会提示404
如果,我们在RouteController控制器中写一个简单的方法,

它会把该方法注册来路由中,因为没有指定HTTP的请求方式,此时,不管是GET还是POST,或者其他请求方式,都可以访问到该路由

RESTful架构中,需要规范我们的名称和HTTP请求方式,不同的请求方式来处理不同的业务。在ASP.NET Core 6.0中,我们可以通过HttpMethod来指定请求方式

1
2
3
4
[HttpGet]
public string Hello() {
return "Hello World!";
}

当我们在Hello方法加上HttpGet,表示该方法只能通过GET请求方式才能执行。

Route特性不仅可以作用于Controller类,还可以在方法上

路由模板

Route特性参数可以传入模板字符串,在Route参数中加入一对{}符号,{}符号里面便是方法参数名,如:

1
Route("sayhello/{name}")

此时,我们访问接口时就必须跟上{name}的值,否则会提示404

除了Route可以传入模板字符串外,其实HttpGet这类特性也可以做类似Route路由的工作,并也可以传入字模板符串

为了防止用户恶意传入非法参数,ASP.NET Core 6.0也提供了路由约束,它会按照规则去匹配参数是否符合规则

,如果不符合,则会直接返回404,如:

1
2
3
4
5
6
7
8
9
10
[Route("api/[controller]")]
[ApiController]
public class RouteController : ControllerBase
{

[HttpGet("sayhello/{name:length(2,5)}")]
public string Hello(string name) {
return $"Hello {name}!";
}
}

如果URL中name这个参数的占位符长度小于2或者大于5,都会提示404



当然,也可以官方提供的规则不能满足你的要求,别担心,它还给我们提供了正则匹配,如果还是不满足,咱们还可以继承IRouteConstraint 接口来自定义。

路由这一小节东西太多了,要学习完得花些时间了,这里只是走马观花式的大概了解一下常用的基础内容。

跟着官网学ASP.NET Core 6.0之路由

https://blogs.52fx.biz/posts/2113214763.html

作者

eyiadmin

发布于

2022-02-26

更新于

2024-05-31

许可协议

评论