M2 ‐ Creación de un Web Service RESTful - sjperalta/Web-Service-C-sharp GitHub Wiki

Crear un API web con ASP.NET Core

Introducción

Referencias: https://learn.microsoft.com/es-es/dotnet/csharp/fundamentals/types/classes

En este tutorial, se creará una API web para administrar una lista de tareas.

Configuración del entorno

Requisitos previos

Crear una API web

  1. Crear una API web:

    • Abra la terminal integrada.

    • Cambie de directorio (cd) a la carpeta que contendrá la carpeta del proyecto.

    • Ejecute los siguientes comandos:

      dotnet new webapi -o TodoApiRestfull
      cd TodoApiRestfull
      dotnet add package Microsoft.EntityFrameworkCore.InMemory
      code -r ../TodoApiRestfull
  2. Confiar en el certificado de desarrollo HTTPS:

    • Ejecute el siguiente comando:

      dotnet dev-certs https --trust

      Nota: Este comando no funciona en Linux. Consulte la documentación de su distribución de Linux para confiar en un certificado.

  3. Ejecutar la aplicación:

    • Para iniciar la aplicación en el perfil https, ejecute:

      dotnet run --launch-profile https

Crear el modelo de datos

  1. Cree una carpeta llamada Models y agregue un archivo TodoItem.cs con el siguiente contenido:

    namespace TodoApiRestfull.Models
    {
        public class TodoItem
        {
            public long Id { get; set; }
            public string Name { get; set; }
            public bool IsComplete { get; set; }
        }
    }
  2. Cree una carpeta llamada Data y agregue un archivo TodoContext.cs con el siguiente contenido:

    using Microsoft.EntityFrameworkCore;
    using TodoApiRestfull.Models;
    
    namespace TodoApiRestfull.Data
    {
        public class TodoContext : DbContext
        {
            public TodoContext(DbContextOptions<TodoContext> options)
                : base(options)
            {
            }
    
            public DbSet<TodoItem> TodoItems { get; set; }
        }
    }

Su archivo Program.cs deberia de verse de la siguiente forma:

using Microsoft.EntityFrameworkCore;
using TodoApiRestfull.Data;

var builder = WebApplication.CreateBuilder(args);

//AddControllers es una funcion que permite utilizar controllers para mapear las llamadas
builder.Services.AddControllers();
builder.Services.AddDbContext<TodoContext>(opt =>
    opt.UseInMemoryDatabase("TodoList"));

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

//app.UseAuthorization();

//Funcion que se utiliza para mapear los controllers
app.MapControllers();

app.Run();

MVC (Model-View-Controller)

MVC es un acrónimo que significa Model-View-Controller (Modelo-Vista-Controlador). Es un patrón de diseño de software utilizado principalmente en el desarrollo de aplicaciones web. Este patrón separa una aplicación en tres componentes principales, lo que facilita la organización y gestión del código. Aquí están los componentes del patrón MVC:

image

Modelo (Model):

Representa la lógica de la aplicación y maneja los datos que se transfieren entre la vista y el controlador. Es responsable de acceder a la base de datos, validar datos, y gestionar la lógica de negocio.

Vista (View):

Es la parte de la aplicación que presenta la interfaz de usuario. Recibe los datos del modelo y los muestra al usuario. La vista no contiene lógica de negocio.

Controlador (Controller):

Actúa como intermediario entre el modelo y la vista. Recibe las entradas del usuario a través de la vista, procesa esas entradas (a menudo invocando métodos en el modelo), y devuelve la vista apropiada para ser mostrada al usuario.

El patrón MVC es popular porque promueve una separación clara de responsabilidades, lo que facilita la gestión y el mantenimiento del código. Cada componente tiene una responsabilidad específica y no se mezcla con las otras capas, lo que resulta en un código más limpio y modular.

Generar automáticamente un controlador

dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
dotnet tool install -g dotnet-aspnet-codegenerator

Si presentan problemas podrian desinstalar el generador de codigo.

dotnet tool uninstall -g dotnet-aspnet-codegenerator
dotnet tool update -g dotnet-aspnet-codegenerator

Los comandos anteriores:

  • Agregan los paquetes NuGet necesarios para el scaffolding.
  • Instalan el motor de scaffolding (dotnet-aspnet-codegenerator) después de desinstalar cualquier versión anterior posible.
dotnet aspnet-codegenerator controller -name TodoItemsController -async -api -m TodoItem -dc TodoContext -outDir Controllers

Correr el proyecto:

dotnet run --launch-profile https

Resultado

https://localhost:7214/api/TodoItems

LINQ

image LINQ (Language Integrated Query) es una tecnología de .NET que permite realizar consultas a colecciones de datos de una manera consistente y fácil de leer. LINQ unifica el acceso a diferentes tipos de datos, como colecciones en memoria, bases de datos, servicios web, XML, entre otros, proporcionando una sintaxis común y robusta.

Componentes Principales de LINQ

Standard Query Operators: Son métodos que permiten realizar operaciones de consulta como selección, filtrado, agrupación, ordenación y transformación de datos. Estos métodos incluyen Where, Select, OrderBy, GroupBy, Join, etc.

Ventajas de Usar LINQ

  • Consistencia: Usa la misma sintaxis para consultar diferentes fuentes de datos.
  • Legibilidad: Las consultas LINQ suelen ser más fáciles de leer y escribir.
  • Menos Errores: Reduce la posibilidad de errores al eliminar la necesidad de concatenar cadenas para consultas SQL.
  • Mantenibilidad: Al ser una parte integral del lenguaje, las consultas LINQ pueden ser refactorizadas y mantenidas con las herramientas estándar de C#.

Ejemplo de LINQ creando un nuevo endpoint

[HttpGet("FilterByName")]
public async Task<ActionResult<IEnumerable<TodoItem>>> FilterByName([FromQuery] string name)
{
    if (string.IsNullOrWhiteSpace(name))
    {
        return await _context.TodoItems.ToListAsync();
    }

    var items = await _context.TodoItems
      .Where(item => item.Name.Contains(name))
      .ToListAsync();

    if (items == null || items.Count == 0)
    {
       return NotFound();
    }

       return items;
    }
[HttpGet("search/{name}")]
        public async Task<ActionResult<List<TodoItem>>> Search(string name)
        {
            //retornara uno o mas elementos
            //select * from dbo.TodoItems t where t.name like '%name%' 
            var result = await _context.TodoItems
                .Where(item => item.Name.Contains(name))
                .ToListAsync();

            if(!result.Any()) {
                return NotFound();
            }

            return Ok(result);
        }

Ejemplo de convension de nombres

image

⚠️ **GitHub.com Fallback** ⚠️