.net5 core webapi项目实战之七:F3管理员修改用户角色

本篇实现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}/password 用户修改密码

 

在此功能中使用的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中的查询参数名称相同,否则是获取不到值的。

 

.net5 core webapi项目实战之七:F3管理员修改用户角色

上一篇:C# 设计模式-观察者模式


下一篇:C# dictionary keys case insensitive