lo que tienes ahora
Para utilizar sus métodos que arriba tendrá que ir RPC. Eso es porque su ejemplo ya está a medio camino impregnado del estilo RPC de hacer las cosas. Las rutas WebAPI predeterminadas alientan las configuraciones RESTful, pero si realiza una modificación menor a sus rutas, todo comenzaría a funcionar. Por ejemplo, podría cambiar su ruta por defecto a algo así como una ruta MVC típica:
routes.MapRoute(name : "Default",
url : "{controller}/{action}/{id}",
defaults: new { controller = "Home",
action = "Index",
id = UrlParameter.Optional });
Después de la adición de la ruta, llamar a las cosas en la manera típica de MVC en los que utilice el nombre del controlador & acción. Desde su pregunta, sin embargo, sospecho que en realidad quiere ser REST, en lugar de conseguir que funcione así que sigue leyendo ...
Ser REST
RESTO doesn't require HTTP, aunque los dos son a menudo discutidas en conjunto. REST realmente se trata de que cada recurso tenga una representación semánticamente precisa. Cuando se usa HTTP, significa URI únicos que respetan la semántica de HTTP. Por ejemplo, una llamada que use HTTP GET nunca debe modificar los datos porque eso viola la definición de HTTP de GET y la infraestructura HTTP confusa como los cachés.
de POST/PUT vs MERGE/PATCH
Todos estamos familiarizados con GET, POST, PUT, CABEZA, etc .. como métodos HTTP. Generalmente, GET es para recuperar, POST es para agregar, y PUT es para modificar (aunque sujeto a mucho debate). Sin embargo, tiene dos tipos de modificaciones: agregar elementos y eliminar elementos de una colección. Entonces, ¿esos son PUT u otra cosa? La comunidad hasn't quite settled sobre cómo hacer esto.
Opción 1: Custom tipo de medio - La especificación HTTP realmente permite que todos los métodos de clases, que son los navegadores que realmente nos restringen al subconjunto familiar. De modo que puede crear métodos MERGE (a Roy Fielding work around) or PATCH (an oData work around) y definir el comportamiento para este nuevo tipo de medio, tal vez uno para agregar y otro para eliminar.
Opción 2: Use POST/PUT - Use PUT para agregar y eliminar contactos. Simplemente trate la lista de identificaciones como un alternar (si existe eliminar, si falta agregar) o alternativamente incluya suficiente información para saber qué hacer. A continuación, devuelva un HTTP 303 que indica al cliente que tiene un estado obsoleto y actualice.
Opción 3: Lista completa - Si su conjunto tiene un tamaño razonable, siempre puede pasar una lista completa de contactos cada vez que desee actualizar. De esta manera, la lógica es una limpieza súper simple y reemplazar.
Lo que realmente importa desde una perspectiva RESTful es que su aplicación se comporte de manera consistente en todos los métodos. Entonces, si MERGE significa agregar, siempre debería significar agregar. Si espera que un conjunto completo de ID pase a PUT, siempre pase un conjunto completo.
diseño del controlador
Si fuera yo, me romperé el controlador en varios controladores. Un controlador trata con Grupos, otro trata Contactos (como grupo) y un tercero trata con un contacto dentro de un grupo. Algo así como ...
//api/Group/
public List<GroupModel> Get()
public GroupModel Get(int ID)
public GroupModel Post(GroupModel model) //add a group
public GroupModel Put(GroupModel model) //update a group (see comments above)
public void Delete(int ID)
//api/GroupContacts/
public ContactsModel Get() //gets complete list
public void PostContacts(ContactsModel model) //pushes a COMPLETE new state
public void Delete() //delete entire group of contacts
//api/GroupContact/354/
public ContactModel Get(int id) //get contact id #354
public void PostContact(ContactModel model) //add contact (overwrite if exits)
public void Delete(int id) //delete contact if exists
Si desea que aparezca anidado de su URL (por ejemplo: /api/Group/Contacts
, /api/Group/Contact
), se puede ver en this other post I wrote. En mi humilde opinión, el enrutamiento de asp.net necesita un ajuste para facilitar el anidamiento un poco más fácil ... pero ese es un problema diferente ;-)
¡Gracias por la increíble respuesta! Estoy de acuerdo con su afirmación de que REST es más acerca de la semántica, y es por eso que creo que mi ejemplo sigue siendo REST. Y curiosamente, en realidad encontré tu otra publicación antes e implementé algo similar usando subcarpetas y teniendo una ruta para cada subcarpeta, iba a responder esta publicación yo mismo si nadie respondía marcando mi solución, pero supongo No necesito molestar ahora: D – jcvandan
Me alegro de estar de servicio. Acabo de estar trabajando en un gran proyecto API que comenzó durante la versión beta de webapi. Me tomó un tiempo entender el sutil cambio de diseño entre MVC, donde podría tener un montón de métodos en un controlador y el estilo de API donde tengo proliferación de controladores. – EBarr
@EBarr Me gustaría recibir sus comentarios sobre el enrutamiento jerárquico que demostré en mi respuesta a esta pregunta. –