Ho la seguente interfaccia nel mio livello aziendale
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);
}
Ora voglio fornire API Web per questa interfaccia. Come puoi vedere questa interfaccia ha più get
metodi che restituiscono un elemento GetUserById
e GetUserByCredentials
, ha anche più metodi di aggiornamento UpdateUser
e UpdateUserPassword
, in futuro potrei voler aggiungere un ulteriore metodo get che ritorna una collezione, ad esempio GetAllUsers
, per esempio.
La soluzione ovvia era incapsulare questa funzionalità in un controller.
Quindi, cosa ho fatto prima, in WebApiConfig
ho cambiato la configurazione dei percorsi in
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 }
);
Poi ho creato un UsersController
che assomiglia a questo
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
}
}
Come puoi vedere dal codice precedente, ho URI diversi per ogni metodo di azione, ad es. per GetUserById
- api/users/getuserbyid?id=1
, per GetUserByCredentials
- api/users/getuserbycredentials?login=log&password=pass
e così via. Questa soluzione funziona bene finora, ma il problema è che, per quanto ne so, non è possibile avere più risultati secondo REST, quindi questa soluzione è ancora conforme ai vincoli per un servizio RESTful? E se no, come posso renderlo veramente riposante? L'idea di dividere questa interfaccia in controller diversi mi sembra un po 'strana, perché in futuro potrei voler aggiungere alcuni nuovi metodi alla mia interfaccia, ad esempio GetUsersByGender
, GetUsersByDateOfBirthday
e così via (se sto andando per creare un nuovo controller ogni volta, non mi sembra corretto)