metodos-accion-aspnet

Qué es y cómo usar métodos de acción en ASP.NET Core

  • 3 min

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

  1. Públicos: Los métodos de acción deben ser públicos para que el framework pueda invocarlos.
  2. No estáticos: No pueden ser estáticos, ya que deben pertenecer a una instancia del controlador.
  3. Asociados a rutas: Cada método de acción está asociado a una ruta específica a través del enrutamiento.
  4. 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.

AtributoDescripció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() → GET
  • Post() → POST
  • Put() → PUT
  • Delete() → 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 ruta api/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].