Las acciones son cada uno de los métodos dentro de un controlador, que están encargados de responder a una solicitud HTTP específica.
Cada controlador contendrá contiene una o más acciones, que estarán asociados a cada tipo de solicitud (GET, POST, PUT, DELETE, …)
Internamente, las acciones no son más que métodos públicos dentro del controlador. Podrán recibir parámetros, y devolver diferentes tipos de respuestas.
Características principales de los métodos de acción
- Públicos: Los métodos de acción deben ser públicos para que el framework pueda invocarlos.
- No estáticos: No pueden ser estáticos, ya que deben pertenecer a una instancia del controlador.
- Asociados a rutas: Cada método de acción está asociado a una ruta específica a través del enrutamiento.
- Pueden recibir parámetros: Pueden aceptar parámetros que se pasan a través de la URL, el cuerpo de la solicitud o los encabezados.
Mapeo de acciones a solicitudes HTTP
Para que la acción funcione correctamente, tenemos que mapear (asociar) cada accion a una solicitud HTTP. Podemos hacerlo de dos formas:
La forma más habitual (y recomendada) es usar atributos para definir cómo las acciones manejan las solicitudes HTTP.
Estos atributos se colocan encima de los métodos de acción y especifican el verbo HTTP que manejan, así como otras configuraciones.
Atributo | Descripción |
---|---|
[HttpGet] | Maneja solicitudes HTTP GET |
[HttpPost] | Maneja solicitudes HTTP POST |
[HttpPut] | Maneja solicitudes HTTP PUT |
[HttpDelete] | Maneja solicitudes HTTP DELETE |
[HttpPatch] | Maneja solicitudes HTTP PATCH |
Por ejemplo,
[HttpPost("crear")]
public IActionResult CrearProducto([FromBody] Producto producto) { ... }
Es la opción recomendada
La otra opción (no recomendada) es usar convenciones de nombre de los métodos. ASP.NET automáticamente mapea:
Get()
→ GETPost()
→ POSTPut()
→ PUTDelete()
→ DELETE
Por ejemplo así,
public class ProductosController : ControllerBase
{
// mapeadoo automáticamente a GET /productos
public IActionResult Get() { ... }
}
No uséis esto, salvo que os lo encontréis en un proyecto que no es vuestro, y no os quede otra opción.
Ejemplo con atributos
Vamos a verlo más fácil con un ejemplo completo. Voy a hacer el ejemplo sólo con atributos porque es el que usaréis frecuentemente (el otro no deberíais ni mirarlo 🤭)
Un ejemplo de mapeado con Controller sería el siguiente,
public class ProductosController : ControllerBase
{
[HttpGet("api/productos")]
public IActionResult ObtenerProductos()
{
var productos = new List<string> { "Producto 1", "Producto 2", "Producto 3" };
return Ok(productos);
}
[HttpPost("api/productos")]
public IActionResult CrearProducto([FromBody] string nombreProducto)
{
// Lógica para crear un producto
return CreatedAtAction(nameof(ObtenerProductos), new { id = 1 }, nombreProducto);
}
}
En este ejemplo,
- La acción
ObtenerProductos
responde a una solicitud GET en la rutaapi/productos
- La acción
CrearProducto
responde a una solicitud POST en la misma ruta. - El parámetro
nombreProducto
se obtiene del cuerpo de la solicitud gracias al atributo[FromBody]
.