.net5 core webapi项目实战之三:webapi的路由及与传统mvc的不同点

 .net core webapi中路由总的设计原则可以参考官方文档中的这一句话(红圈处):

即 REST APIs 应使用 属性路由(也有译为“特性路由”)将应用程序的功能建模为一组资源,对资源的操作由 HTTP 谓词表示。

 

下面我们结合UsersController.cs的代码来分析如何体现这一设计原则:

 1 using Microsoft.AspNetCore.Mvc; 
 2 
 3 namespace WebApiDemo.Controllers
 4 {
 5     [Route("api/[controller]")]
 6     [ApiController]
 7     public class UsersController : ControllerBase
 8     {
 9 
10         [HttpGet]
11         public ContentResult ManageUsers()
12         {
13             return Content("hello world.");
14         }
15 
16     }
17 }

当客户端(可以是浏览器或其他应用程序)访问网址 http://localhost:52384/api/users 的时候

框架将网址经路由系统的解析映射到ManageUsers()这个方法上, 此方法返回 "hello world."的字符串,然后传递给客户端,

在这个过程中,路由是如何发挥作用的?它和MVC中的路由又有什么不同?

 

一、在传统的MVC框架中,如果我们要输出"hello world."的字符串,访问如下的网址:

http://localhost:52384/users/manageusers,

框架在解析的时候将users对应到UsersController ,manageusers对应到该Controller下的Action ,

这是因为传统的MVC路由模板一般是这样的"{controller}/{action}/{id?}" ,这种路由方式称为"传统路由"。

 

二、在.net core webapi中,使用的是RESTful风格的路由,网址如下:http://localhost:52384/api/users

这种路由方式需要给Controller设置Route属性(本例中是[Route("api/[controller]")])作为路由模板,

然后用HTTP谓词定位到Controller中的方法,即Controller还是从网址中解析,具体要执行controller中的哪个方法,

是由HTTP词决定的,这种路由方式称为"属性路由"。

 

三、在上面的代码中,

1 . 如果用GET的方式访问http://localhost:52384/api/users 这个网址,则可以定位到ManageUsers()方法,

如果用POST或PUT等其他HTTP词,是不能定位到ManageUsers()这个方法的,

执行controller中的哪个方法与方法名称无关,而与HTTP词有关,如果ManageUsers()这个方法名换成Abcd()后再去

访问http://localhost:52384/api/users依然可以正确的得到"hello world."的字符串。

2 . 网址中"api"是特定字符串(可以根据需要修改),如果去掉,那么[Route("api/[controller]")]应改成[Route("[controller]")],

访问的网址也应改成http://localhost:52384/users,

Controller上的Route()属性用于指定路由匹配规则,特定字符串可以直接写,关键字需要用[]括起来,变量则使用{},

Route()属性可以作用在Controller下的方法上,后续再详细介绍。

 

四、ASP.NET Core 具有以下 HTTP 谓词模板:

HttpGet
HttpPost
HttpPut
HttpDelete
HttpHead
HttpPatch

 

五、.net core webapi中的方法称为终结点(Endpoint)

 

六、.net core webapi中的controller都继承自ControllerBase这个父类,而不是Controller,官方文档的解释如下:

 

七、[ApiController]的作用,官方文档的解释如下:

上面的描述后续再结合具体的使用场景逐个讲解。

 

posted @ 2021-01-26 12:56  屏风马  阅读(3481)  评论(1编辑  收藏  举报