根据RESTful API约束,你可以在asp net web api控制器中有多个get动作方法吗?

时间:2017-05-16 09:11:18

标签: asp.net rest api asp.net-web-api

我的业务层中有以下界面

    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方法可返回一个项GetUserByIdGetUserByCredentials,它还具有多种更新方法UpdateUserUpdateUserPassword我可能想要添加返回集合的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=1GetUserByCredentials - api/users/getuserbycredentials?login=log&password=pass等等。到目前为止,此解决方案工作正常,但问题是,据我所知,根据REST,您不能拥有多个获取,因此该解决方案是否仍然符合RESTful服务的约束?如果不是,我怎么能让它真正RESTful?将此接口拆分为不同控制器的想法对我来说似乎有些奇怪,因为将来我可能想在我的界面中添加一些新方法,例如GetUsersByGenderGetUsersByDateOfBirthday等等(如果我每次都要创建一个新的控制器,这对我来说听起来不正确)

0 个答案:

没有答案