本篇实现F3功能(见红色部分)
功能序号 | HTTP谓词(HTTP verbs) | API | 描述 |
F1 | GET | /api/users |
管理员获取用户列表 |
F2 | POST | /api/users |
管理员添加用户 |
F3 | PATCH | /api/users/{id}/role | 管理员修改用户角色 |
F4 | PATCH | /api/users/{id}/state | 管理员锁定/解锁用户 |
F5 | GET | /api/users/{id} | 用户获取自己的信息 |
F6 | PUT | /api/users/{id} | 用户更新自己的信息 |
F7 | PATCH | /api/users/{id} |
用户修改密码 |
在此功能中使用的HTTP谓词是PATCH,而锁定/解锁用户及修改密码也是同样的谓词,
所以我们需要给终结点添加Route属性加以区分,以便让路由系统能正确的匹配到。
在.net core webapi中,Controller和Endpoint都可以添加Route属性,如果都添加,其路由是叠加关系。
比如UsersController的Route属性设置成[Route("api/[controller]")] , 某个Endpoint的Route属性设置成[Route("role")] ,
那么组合而成的路由就是api/[controller]/role,访问网址http://localhost:52384/api/users/role就能匹配到该Endpoint上。
先看代码:
1 [HttpPatch] 2 [Route("{id}/role")] 3 public ContentResult ManageRole(int id) 4 { 5 int roleCode = Convert.ToInt32(Request.Query["roleCode"]); 6 _userDao.UpdateUserRole(id, roleCode); 7 8 return Content("{‘result‘:‘success‘}"); 9 }
1. 因为只是更新t_user表的部分字段,所以这里的HTTP谓词用HttpPatch
2.终结点ManageRole( )中的形参id是和[Route("{id}/role")]中的id对应的,
是从网址中传递过来的,是一个变量,所以用{ }括起来,本例中客户端调用的网址就是:
http://localhost:52384/api/users/2/role?rolecode=2,
路由会将api/users匹配给UsersController上的Route,2/role匹配给终结点ManageRole(int id)上的Route;
需要注意的是[Route("{id}/role")]前面千万不要加"/",因为"/"表示根路径,写成[Route("/{id}/role")]是错误的。
3.网址后的查询参数roleCode=2在终结点ManageRole( )中除了可以用Request.Query["roleCode"]接收外,
还可以用[fromQuery]属性来获取,这样ManageRole( )需要做相应的修改,代码如下:
1 [HttpPatch] 2 [Route("{id}/role")] 3 public ContentResult ManageRole(int id, [FromQuery] int roleCode) 4 { 5 //int roleCode = Convert.ToInt32(Request.Query["roleCode"]); 6 7 _userDao.UpdateUserRole(id, roleCode); 8 9 return Content("{‘result‘:‘success‘}"); 10 }
注:ManageRole( )中的形参roleCode一定要和网址
http://localhost:52384/api/users/2/role?rolecode=2中的查询参数名称相同,否则是获取不到值的。