Inicio > Cursos > C# > Proyecto: API con ASP.NET Core
C#C# ModernoLección 20 de 20

Proyecto: API con ASP.NET Core

ASP.NET Core es el framework web de Microsoft para crear APIs y aplicaciones web con C#. Con las Minimal APIs (introducidas en .NET 6), crear un endpoint completo toma apenas una línea: app.MapGet("/api/usuarios", () => db.Usuarios.ToList()). Swagger se integra automáticamente para documentar y probar la API desde el navegador.

Entity Framework Core (EF Core) es el ORM que mapea objetos C# a tablas de base de datos sin escribir SQL manual.

El proyecto demuestra el patrón completo de una API REST: las cuatro operaciones CRUD (GET, POST, PUT, DELETE) con validación de errores y respuestas HTTP correctas (201 Created, 404 Not Found, 204 No Content). Results es una clase estática que provee métodos para crear respuestas HTTP semánticamente correctas.

La inyección de dependencias (TareasDb db en los parámetros) es automática: ASP.NET Core crea y provee la instancia del DbContext sin que tengas que instanciarlo manualmente.

// Program.cs (ASP.NET Core Minimal API)
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<TareasDb>(opt =>
    opt.UseInMemoryDatabase("tareas"));
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();

// GET todos
app.MapGet("/api/tareas", async (TareasDb db) =>
    await db.Tareas.ToListAsync())
    .WithName("GetTareas");

// GET por id
app.MapGet("/api/tareas/{id}", async (int id, TareasDb db) =>
    await db.Tareas.FindAsync(id)
        is Tarea t ? Results.Ok(t) : Results.NotFound())
    .WithName("GetTarea");

// POST - crear
app.MapPost("/api/tareas", async (TareaDto dto, TareasDb db) => {
    var tarea = new Tarea { Titulo = dto.Titulo, Completada = false };
    db.Tareas.Add(tarea);
    await db.SaveChangesAsync();
    return Results.Created($"/api/tareas/{tarea.Id}", tarea);
}).WithName("CreateTarea");

// PUT - actualizar
app.MapPut("/api/tareas/{id}", async (int id, TareaDto dto, TareasDb db) => {
    var tarea = await db.Tareas.FindAsync(id);
    if (tarea is null) return Results.NotFound();
    tarea.Titulo = dto.Titulo;
    tarea.Completada = dto.Completada;
    await db.SaveChangesAsync();
    return Results.Ok(tarea);
});

// DELETE
app.MapDelete("/api/tareas/{id}", async (int id, TareasDb db) => {
    if (await db.Tareas.FindAsync(id) is Tarea t) {
        db.Tareas.Remove(t);
        await db.SaveChangesAsync();
        return Results.NoContent();
    }
    return Results.NotFound();
});

app.Run();

// Modelos
record TareaDto(string Titulo, bool Completada = false);

class Tarea {
    public int Id { get; set; }
    public string Titulo { get; set; } = "";
    public bool Completada { get; set; }
}

class TareasDb : DbContext {
    public TareasDb(DbContextOptions<TareasDb> o) : base(o) {}
    public DbSet<Tarea> Tareas => Set<Tarea>();
}
Consejo🌐 Minimal APIs de ASP.NET Core son perfectas para microservicios. Para apps más complejas con autenticación y autorización, usa Controllers.
← Entity Framework Core

Practica esta lección

Resuelve los ejercicios del curso de C# en la app, gratis y con corrección automática.

Empezar a practicar