跟着官网学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 | [HttpGet] |
当我们在Hello
方法加上HttpGet
,表示该方法只能通过GET
请求方式才能执行。
Route
特性不仅可以作用于Controller
类,还可以在方法上
路由模板
Route
特性参数可以传入模板字符串,在Route
参数中加入一对{}
符号,{}
符号里面便是方法参数名,如:
1 | Route("sayhello/{name}") |
此时,我们访问接口时就必须跟上{name}
的值,否则会提示404
除了Route
可以传入模板字符串外,其实HttpGet
这类特性也可以做类似Route
路由的工作,并也可以传入字模板符串
为了防止用户恶意传入非法参数,ASP.NET Core 6.0
也提供了路由约束,它会按照规则去匹配参数是否符合规则
,如果不符合,则会直接返回404,如:
1 | [Route("api/[controller]")] |
如果URL中name
这个参数的占位符长度小于2或者大于5,都会提示404
当然,也可以官方提供的规则不能满足你的要求,别担心,它还给我们提供了正则匹配,如果还是不满足,咱们还可以继承IRouteConstraint
接口来自定义。
路由这一小节东西太多了,要学习完得花些时间了,这里只是走马观花式的大概了解一下常用的基础内容。
跟着官网学ASP.NET Core 6.0之路由