我的业务层中有以下界面
public interface IUserService
{
void CreateUser(User user);
List<User> FindUsersByName(string searchedString);
User GetUserById(int userId);
User GetUserByCredentials(string login, string password);
void UpdateUser(User user);
void UpdateUserPassword(int userId, string oldPassword, string newPassword);
}
现在我想为这个界面提供web api。如您所见,此界面有多个get
方法可返回一个项GetUserById
和GetUserByCredentials
,它还具有多种更新方法UpdateUser
和UpdateUserPassword
我可能想要添加返回集合的aditional get方法,例如GetAllUsers
。
显而易见的解决方案是将此功能封装在一个控制器中。
所以我首先在WebApiConfig
中将路由配置更改为
config.Routes.MapHttpRoute(
name: "DefaultApi",
//as you can see I added {action} to the path so that, it will be possible to differentiate between different get/put requests
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
然后我创建了一个看起来像这样的UsersController
public class UsersController : ApiController
{
private readonly IUserService _userService;
public UsersController(IUserService userService)
{
_userService = userService;
}
// POST api/users/createuser
[HttpPost]
public IHttpActionResult CreateUser(User user)
{
//some code
}
// GET api/users/getuserbyid?id=1
[HttpGet]
public IHttpActionResult GetUserById(int id)
{
//some code
}
// GET api/users/getuserbycredentials?login=log&password=pass
[HttpGet]
public IHttpActionResult GetUserByCredentials(string login, string password)
{
//some code
}
// GET api/users/findusersbyname?searchedString=jack
[HttpGet]
public IHttpActionResult FindUsersByName(string searchedString)
{
//some code
}
// PUT api/users/updateuser
[HttpPut]
public IHttpActionResult UpdateUser(UserBase user)
{
//some code
}
// PUT api/users/updateuserpassword?userId=1&oldPassword=123&newPassword=1234
[HttpPut]
public IHttpActionResult UpdateUserPassword(int userId, string oldPassword, string newPassword)
{
//some code
}
}
从上面的代码中可以看出,我对每个操作方法都有不同的URI,例如GetUserById
- api/users/getuserbyid?id=1
,GetUserByCredentials
- api/users/getuserbycredentials?login=log&password=pass
等等。到目前为止,此解决方案工作正常,但问题是,据我所知,根据REST,您不能拥有多个获取,因此该解决方案是否仍然符合RESTful服务的约束?如果不是,我怎么能让它真正RESTful?将此接口拆分为不同控制器的想法对我来说似乎有些奇怪,因为将来我可能想在我的界面中添加一些新方法,例如GetUsersByGender
,GetUsersByDateOfBirthday
等等(如果我每次都要创建一个新的控制器,这对我来说听起来不正确)