.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]的作用,官方文档的解释如下:
上面的描述后续再结合具体的使用场景逐个讲解。