c#-4.0 - tutorial - web api rest c#
¿Cómo manejar las rutas jerárquicas en ASP.NET Web API? (4)
Actualmente tengo dos controladores
1 - Controlador principal
2 - Controlador infantil
Accedo a mi Controlador Principal como este
someurl/parentcontroller
Ahora quiero acceder al controlador de mis hijos como este
someurl/parentcontroller/1/childcontroller
Esta última URL debe devolver todos los hijos de un padre en particular.
Tengo esta ruta actualmente en mi archivo global.asax
routes.MapHttpRoute ("Route1", "{controller}/{id}", new { id = RouteParameter.Optional });
No estoy seguro de cómo puedo lograr mi jerarquía parent/id/child
... ¿Cómo debo configurar mis rutas para lograr esto? Ideas?
Configure las rutas como a continuación. El {param} es opcional (úselo si lo necesita):
routes.MapHttpRoute(
name: "childapi",
routeTemplate: "api/Parent/{id}/Child/{param}",
defaults: new { controller = "Child", param = RouteParameter.Optional }
);
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Luego llame al niño APi como / api / Parent / 1 / child El padre se puede llamar simple como / api / Parent /
El controlador de niño:
public class ChildController : ApiController
{
public string Get(int id)
{
//the id is id between parent/{id}/child
return "value";
}
.......
}
Desde Web API 2 ahora puede usar los atributos de ruta para definir el enrutamiento personalizado por método,
[Route("api/customers/{id:guid}/orders")]
public IEnumerable<Order> GetCustomerOrders(Guid id) {
return new Order[0];
}
También necesita agregar la siguiente línea al método de inicialización WebApiConfig.Register (),
config.MapHttpAttributeRoutes();
Artículo completo, http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
Quería manejar esto de una manera más general, en lugar de conectar un ChildController directamente con controller = "Child"
, como lo hizo Abhijit Kadam. Tengo varios controladores secundarios y no quería tener que mapear una ruta específica para cada uno, con controller = "ChildX"
y controller = "ChildY"
una y otra vez.
Mi WebApiConfig
ve así:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "ChildApi",
routeTemplate: "api/{parentController}/{parentId}/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Mis controladores principales son muy estándar y coinciden con la ruta predeterminada anterior. Un ejemplo de controlador hijo tiene este aspecto:
public class CommentController : ApiController
{
// GET api/product/5/comment
public string Get(ParentController parentController, string parentId)
{
return "This is the comment controller with parent of "
+ parentId + ", which is a " + parentController.ToString();
}
// GET api/product/5/comment/122
public string Get(ParentController parentController, string parentId,
string id)
{
return "You are looking for comment " + id + " under parent "
+ parentId + ", which is a "
+ parentController.ToString();
}
}
public enum ParentController
{
Product
}
Algunos inconvenientes de mi implementación
- Como puede ver, utilicé una
enum
, por lo que todavía tengo que administrar los controladores principales en dos lugares separados. Podría haber sido fácilmente un parámetro de cadena, pero quería evitar queapi/crazy-non-existent-parent/5/comment/122
funcione. - Probablemente haya una forma de usar la reflexión o algo así para hacer esto sobre la marcha sin administrarlo por separado, pero esto funciona para mí por ahora.
- No es compatible con niños de niños.
Probablemente haya una mejor solución que es aún más general, pero como dije, esto funciona para mí.
Una opción más allá de usar el enrutamiento mvc predeterminado es mirar el Enrutamiento de atributos: https://github.com/mccalltd/AttributeRouting . Aunque es más trabajo, la decoración de los métodos de acción individuales proporciona una gran cantidad de flexibilidad cuando necesita diseñar rutas complicadas. También puede usarlo junto con el enrutamiento MVC estándar.