Cómo devolver datos de ASP.NET Core Web API

Tenemos tres formas de devolver datos y códigos de estado HTTP desde un método de acción en ASP.NET Core. Puede devolver un tipo específico, devolver una instancia de tipo IActionResult o devolver una instancia de tipo ActionResult. 

Aunque devolver un tipo específico es la forma más sencilla, IActionResult le permite devolver tanto datos como códigos HTTP, y ActionResult le permite devolver un tipo que amplía IActionResult. Un ActionResult se puede utilizar para enviar un código de estado HTTP, datos o ambos desde un método de acción.

Este artículo presenta una discusión sobre cómo podemos devolver datos en ASP.NET Core Web API usando cada uno de esos tipos, con ejemplos de código relevantes en C #. 

Para trabajar con los ejemplos de código ilustrados en este artículo, debe tener Visual Studio 2019 instalado en su sistema. Si aún no tiene una copia, puede descargar Visual Studio 2019 aquí. 

Crear un proyecto de API ASP.Net Core

En primer lugar, creemos un proyecto ASP.NET Core en Visual Studio. Suponiendo que Visual Studio 2019 esté instalado en su sistema, siga los pasos que se describen a continuación para crear un nuevo proyecto ASP.NET Core en Visual Studio.

  1. Inicie el IDE de Visual Studio.
  2. Haga clic en "Crear nuevo proyecto".
  3. En la ventana "Crear nuevo proyecto", seleccione "Aplicación web ASP.Net Core" de la lista de plantillas que se muestran.
  4. Haga clic en Siguiente.
  5. En la ventana "Configure su nuevo proyecto", especifique el nombre y la ubicación del nuevo proyecto.
  6. Haga clic en Crear.
  7. En la ventana "Crear nueva aplicación web ASP.Net Core" que se muestra a continuación, seleccione .NET Core como tiempo de ejecución y ASP.NET Core 2.2 (o posterior) en la lista desplegable en la parte superior. Usaré ASP.NET Core 3.0 aquí.
  8. Seleccione "API" como la plantilla de proyecto para crear una nueva aplicación ASP.NET Core API.
  9. Asegúrese de que las casillas de verificación "Habilitar compatibilidad con Docker" y "Configurar para HTTPS" no estén marcadas, ya que no usaremos esas funciones aquí.
  10. Asegúrese de que la autenticación esté configurada como "Sin autenticación", ya que tampoco usaremos autenticación.
  11. Haga clic en Crear.

Esto creará un nuevo proyecto de API ASP.NET Core en Visual Studio. Ahora seleccione la carpeta de la solución Controladores en la ventana Explorador de soluciones y haga clic en "Agregar -> Controlador ..." para crear un nuevo controlador llamado DefaultController. Usaremos este proyecto para explorar la devolución de datos de métodos de acción en las secciones siguientes de este artículo.

Si desea una manera fácil de probar los métodos de acción que usamos a continuación, le recomiendo aprovechar Postman. Puede descargar una copia de Postman desde aquí. 

Crear clases de controlador y modelo en ASP.NET Core

Cree una nueva carpeta de soluciones y asígnele el nombre Modelos. Es aquí donde colocará sus clases modelo. La siguiente lista de códigos ilustra cómo puede crear una clase de modelo simple denominada Autor.

Autor de clase pública

    {

        public int Id {obtener; conjunto; }

        cadena pública FirstName {get; conjunto; }

        cadena pública LastName {get; conjunto; }

    }

Hasta aquí todo bien. Ahora, reemplace el código generado de la clase DefaultController con la lista de códigos que se proporciona a continuación.

utilizando Microsoft.AspNetCore.Mvc;

utilizando System.Collections.Generic;

espacio de nombres CoreWebAPI.Controllers

{

    [Ruta ("api / [controlador]")]

    [ApiController]

    clase pública DefaultController: ControllerBase

    {

        Autores de lista de solo lectura privada = nueva Lista ();

        public DefaultController ()

        {

            Autores.Añadir (nuevo Autor ()

            {

                Id = 1,

                FirstName = "Joydip",

                LastName = "Kanjilal"

            });

            Autores.Añadir (nuevo Autor ()

            {

                Id = 2,

                FirstName = "Steve",

                LastName = "Smith"

            });

        }

        [HttpGet]

        public IEnumerable Get ()

        {

            autores de retorno;

        }

        [HttpGet ("{id}", Name = "Get")]

        Public Author Get (int id)

        {

            devolver autores.Find (x => x.Id == id);

        }

    }

}

Devuelve un tipo específico de un método de acción en ASP.NET Core

La forma más sencilla de devolver datos de un método de acción es devolver un tipo específico. En la lista de códigos que se muestra arriba, el método de acción Obtener devuelve una lista de instancias de Autor. Estas instancias se crean e inicializan en el constructor de la clase DefaultController. A continuación se muestra nuevamente el método de acción para su referencia. Tenga en cuenta que devuelve IEnumerable. 

[HttpGet]

public IEnumerable Get ()

{

   autores de retorno;

}

A partir de ASP.NET Core 3.0, también tiene la opción de devolver IAsyncEnumerable desde un método de acción. Mientras IEnumerable realiza una iteración de colección sincrónica, IAsyncEnumerable realiza una iteración asincrónica. Por lo tanto, IAsyncEnumerable es más eficiente porque no hay llamadas de bloqueo. (Discutiré IAsyncEnumerable más en una publicación futura aquí).

Así es como puede reescribir el método de acción anterior usando IAsyncEnumerable.

[HttpGet]

public async IAsyncEnumerable Get ()

{

   var autores = aguardar GetAuthors ();

   aguardar a foreach (var autor en autores)

   {

        autor de retorno de rendimiento;

   }

}

Devuelve una instancia de tipo IActionResult de un método de acción en ASP.NET Core

Puede aprovechar la interfaz IActionResult cuando desee devolver tanto datos como códigos HTTP de su método de acción. El siguiente fragmento de código ilustra cómo se puede lograr.

[HttpGet]

public IActionResult Get ()

{

  si (autores == nulo)

      return NotFound ("Sin registros");

  volver Ok (autores);

}

La interfaz IActionResult se implementa mediante las clases OkResult, NotFoundResult, CreatedResult, NoContentResult, BadRequestResult, UnauthorizedResult y UnsupportedMediaTypeResult.

En el fragmento de código anterior, los métodos NotFound () y Ok () devuelven instancias del tipo IActionResult.

Devuelve una instancia de tipo ActionResult de un método de acción en ASP.NET Core

ActionResult se introdujo en ASP.NET Core 2.1. Un ActionResult es un tipo que implementa la interfaz IActionResult. Puede aprovechar el tipo de retorno ActionResult para devolver un tipo que amplíe ActionResult o cualquier otro tipo específico (como Author en nuestro ejemplo).

El siguiente fragmento de código ilustra cómo podemos devolver ActionResult desde un método de acción.

[HttpGet]

public ActionResult Obtener()

{

  si (autores == nulo)

       return NotFound ("Sin registros");

   autores de retorno;

}

Como puede ver en el fragmento de código anterior, ya no necesita envolver el objeto que se devolverá en el método Ok (); simplemente puede devolverlo como está.

Ahora hagamos esto asincrónico. Considere el siguiente método asincrónico, que devuelve la lista de autores.

Tarea asincrónica privada
   
     GetAuthors ()
    

{

    espera Task.Delay (100) .ConfigureAwait (falso);

    autores de retorno;

}

Un método asincrónico debe tener como mínimo una instrucción de espera. Si no tiene ninguna declaración de espera, el compilador generará una advertencia que indica que el método se ejecutará sincrónicamente. Para evitar esta advertencia del compilador, he esperado una llamada al método Task.Delay en el fragmento de código anterior.

El método de acción actualizado se enumera a continuación. Observe cómo se ha utilizado la palabra clave await para invocar el método asíncrono que acabamos de crear.

[HttpGet]

Tarea asíncrona pública > Obtener ()

{

   var data = await GetAuthors ();

   si (datos == nulo)

        return NotFound ("Sin registro");

   devolver datos;

}

También puede devolver una instancia de ActionResult personalizado desde su método de acción. Todo lo que necesita hacer es crear una clase que implemente la interfaz IActionResult e implemente el método ExecuteResultAsync. Hablaremos de IActionResult y ActionResult, así como de las clases ActionResult personalizadas en una publicación futura aquí.