2. ● Microsoft MVP en IA, Developer Technologies y Azure
● Docente en TecNM Celaya
● Estudiante de doctorado en Tomás Bata University in Zlín
Luis Beltrán
@darkicebeam
luis@luisbeltran.mx
luisbeltran.mx
3. Agenda
Requisitos
Qué instalar, prerequisitos y
objetivos de aprendizaje 01
03
02
04
05
¿Qué es Minimal
APIs?
Low ceremony APIs in .NET
Todo API:
Configuración
Construye el backend de una
aplicación Todo usando minimal
APIs
Todo API: CRUD
Construye una aplicación CRUD
Todo API: Bases de
datos
Almacena información en una
base de datos
5. Requisitos
Esto es lo que necesitas para
este taller:
• SDK de .NET 6 (dot.net/download)
• Un editor de tu elección, por
ejemplo Visual Studio Code o
Visual Studio 2019/2022
Puedes descargar Visual Studio Code y el SDK de .NET 6 en
conjunto:
Para macOS: https://aka.ms/dotnet-coding-pack-mac
Para Windows: https://aka.ms/dotnet-coding-pack-win
6. Objetivos de Aprendizaje
Minimal APIs
Obtén información sobre qué es
una minimal API y cuándo debes
usarla.
Aplicaciones CRUD
Aprende qué es una aplicación CRUD básica.
Crea tu propia minimal API para una lista de
elementos.
Aprenderás a crear, leer, actualizar y eliminar
dinámicamente elementos de la lista.
Bases de datos
Aprende a registrar información en
una base de datos persistente con
SQL Server.
8. ¿Qué es una API? 💡API significa Application Programming
Interface
Se trata de colecciones de operaciones que puedes invocar en un
equipo (típicamente llamado servidor) de forma local o remota.
🖥️ Web APIs son operaciones que
puedes invocar a través de HTTP
Esto te permite aprovechar la funcionalidad que proporcionan esas
operaciones.
❗Crear una API puede ser complejo
Necesitan admitir muchas características como enrutamiento, lectura
y escritura en el almacenamiento de datos y autenticación.
¡Aquí es donde las minimal API son áútiles!
9.
10. Minimal APIs
Minimal First
Cree una API en C# con solo 3
líneas de código.
Crece contigo
El ecosistema de C# impulsa las
aplicaciones más productivas de la
web y respaldará su proyecto, sin
importar el tamaño.
Increíblemente rápido
Ha demostrado ser uno de los
servidores web más rápidos del
mundo, atendiendo más de 4
millones de solicitudes por segundo.
Minimal APIs son una forma de baja ceremonia para crear APIs HTTP en ASP.NET Core.
Minimal APIs se enganchan en las capacidades de hospedaje y enrutamiento de
ASP.NET Core y te permiten crear APIs completamente funcionales con solo unas pocas
líneas de código.
🍃 🌱 ⚡
13. Crea y ejecuta tu Todo API
Crea la API con la CLI de .NET
dotnet new web -o TodoApi
Ahora, que has creado tu minimal API, puedes ejecutarla.
Navega a la carpeta TodoApi y ejecuta el siguiente comando
Ejecuta tu minimal API
TodoApi> dotnet watch
Mira tu API en acción
Navega a http://localhost:[port] en un navegador y ve el texto Hello World!
01
02
03
14. Agrega una nueva ruta
Abre tu app TodoApi en un editor de tu elección y
abra el archivo Program.cs.
Tu archivo Program.cs se parece al código
mostrado.
En Program.cs, agrega una nueva ruta /todo a nuestra
API que devuelva una lista de elementos. Añade una
sentencia MapGet después de app.MapGet("/", ()
=> "Hello World!");
Navega a https://localhost:[port]/todo para ver este elemento recién creado
16. Configura OpenAPI y
Swagger UI
Snippet 1: Debajo de var builder = WebApplication.CreateBuilder(args); , agrega las siguientes líneas de
código.
Snippet 2: Arriba de app.MapGet("/", () => "Hello World!");, agrega las siguientes líneas de código:
El método AddSwaggerGen agrega información como el título, la descripción y la versión a la API.
Vuelve al navegador y accede a esta URL: https://localhost:[port]/swagger
17. Todo API: CRUD
04
Previamente, has creado una API simple en la que codificaste los
resultados en el método HTTP.
Ahora, vamos a dar un paso adelante y crear algo dinámico. En
lugar de devolver un elemento estático que está codificado, vamos
a crear una lista de tareas pendientes que podemos actualizar, crear
nuevos elementos, marcar un elemento como completo y eliminar
un elemento.
18. Create Read Update Delete
Nuestra Todo API va a...
Crear un nuevo elemento
Devolver un
elemento
específico
Actualizar un
elemento
existente
Eliminar un elemento
19. Crea un modelo de
datos
Crea una clase que modele los datos que queremos recopilar, también conocido como
modelo de datos. El código para tu TodoItem va después de app.Run();
Así es como se definen los datos que queremos recopilar.
20. Almacena un elemento
Instala el paquete Entity Framework Core InMemory
Entity Framework es una biblioteca de código que permite la transferencia de datos almacenados en
tablas de bases de datos relacionales a objetos que se utilizan con mayor frecuencia en el código de
aplicación.
EntityFramework nos permite conectar nuestro código a los datos que queremos
guardar y consultarlos.
Para hacer esto, ¡vamos a crear una clase TodoDb!
Agrega using Microsoft.EntityFrameworkCore; en la parte superior de tu archivo Program.cs:
21. Debajo de TodoItem crea una clase TodoDb
Snippet 1:
Snippet 2:
Antes de los servicios AddEndpointsApiExplorer que configuramos previamente,
añade el siguiente código
Para obtener una lista de elementos, reemplaza la ruta "/todo" con la ruta "/todos" y su código:
22. Crear nuevos elementos
Vamos a hacer POST de nuevas tareas en la lista.
Debajo del app.MapGet anterior añade:
¡Vamos a probarlo!
Regresa a Swagger y ahora deberías
ver POST /todos. Para agregar
nuevos elementos a la lista:
1. Haz click en POST /todos
2. Haz click en Try it out
3. Actualiza id, item, e isComplete
4. Haz click en Execute
23. Obtener los elementos
1. Haz click en GET /todos
2. Haz click en Try it out
3. Haz click en Execute
La respuesta (Response body) incluirá los elementos recién añadidos
Para obtener (GET) un elemento por su id, añade el código debajo de la ruta app.MapPost
Para comprobar esto, puede ir a https://localhost:5001/todos/1 o usar
la Swagger UI.
24. Actualizar un elemento
Para actualizar un elemento existente,
agrega el siguiente código debajo de la ruta
GET /todos/{id} creada anteriormente.
1. Haz click en PUT/todos/{id}
2. Haz click en Try it out
3. En la caja id ingresa 2
4. Actualiza el Request
body con el código JSON
colocando isComplete en true.
5. Haz click en Execute
Para verificar, desplázate a GET/todos/{id} y revisa que Water Plants está completada.
25. Eliminar un elemento
Para eliminar un elemento existente, agrega el
código siguiente debajo de PUT/todos/{id}
Ahora, intenta eliminar un
elemento.
26. Todo API: Bases de datos
05
Trabajemos con una base de datos persistente para que los datos se
guarden incluso después de cerrar la aplicación.
27. Working with Databases
Acabamos de aprender a construir una aplicación CRUD básica con una base de datos
en memoria.
Vamos a dar un paso adelante y trabajar con una base de datos persistente. Esto
significa que sus datos se guardarán incluso después de cerrar su aplicación.
Para este tutorial usaremos SQL Server.
28. Configura la base de datos SQL Server
SQLServer EF Core Database Provider: puede tener acceso a muchas bases de datos diferentes a través de bibliotecas de
complementos denominadas proveedores de bases de datos.
Instala las siguientes herramientas y paquetes
Entity Framework Core tools: herramientas para que Entity Framework Core realice tareas de desarrollo en tiempo de diseño.
Microsoft.EntityFrameworkCore.Design: contiene toda la lógica en tiempo de diseño para que EF core cree la
base de datos.
29. Habilita la creación de bases de datos
Establece la cadena de conexión de la base de datos
Migra el modelo de datos a una base de datos SQL Server.
Crea un modelo de datos
Crea la base de datos y el esquema
01
02
03
30. Establece la cadena de conexión
En Program.cs debajo de var builder =
WebApplication.CreateBuilder(args); agrega una cadena de conexión.
31. Agrega contexto a tus
servicios
Ahora vamos a reemplazar la base de datos en memoria con una base de datos persistente.
Reemplaza la implementación de la base de datos en
memoria builder.Services.AddDbContext<TodoDb>(options =>
options.UseInMemoryDatabase("items")); en tus servicios build con la de SQL Server:
32. Migra el modelo de datos
Con la herramienta de migración de EF Core, ahora puedes iniciar tu primer
migración InitialCreate. En una ventana de terminal, ejecuta el
comando migrations add :
EF Core creará una carpeta denominada Migrations en el directorio del
proyecto que contiene dos archivos:
33. Crea la base de datos
y el esquema
Ahora que has completado la migración, puedes usarla para crear la base de datos y
el esquema. En una ventana de terminal, ejecuta el comando database
update para aplicar migraciones a una base de datos:
Deberías ver un archivo todos.db recién creado en el directorio del proyecto:
Prueba la aplicación de nuevo en Swagger – verás que tus elementos Todo están
almacenados en la base de datos, por lo que permanecen aún si detienes e
inicias la aplicación de nuevo.
34. CREDITS: This presentation template was created by Slidesgo, including
icons by Flaticon, and infographics & images by Freepik.
Please keep this slide for attribution.
Happy Coding!
¡GRACIAS!
Click to add text
Notes de l'éditeur
Introduce yourself!
More instructions and an overview of this workshop can be found in this GitHub repository: microsoft/workshop-library: A library of workshops written by and for Microsoft Learn Student Ambassadors and Cloud Advocates and their local communities (github.com)
https://github.com/microsoft/workshop-library/tree/main/full/intro-minapi
Recommendation: Send out this list of prerequisite tools prior to giving your session. This way, everyone in the session will already have what they need.
.NET 6 SDK download: http://dot.net/download
VS Code, .NET 6 bundle installer for macOS: https://aka.ms/dotnet-coding-pack-mac
VS Code, .NET 6 bundle installer for Windows: https://aka.ms/dotnet-coding-pack-win
For a web developer, building a web API is a common task. You want to be able to serve some data and know how an application, or service, consumes it. But, how you build the API might differ vastly between tech stacks. As part of building an API, you know there are parts like data storage, security, versioning, and documentation. Getting all these parts to work can be a complex undertaking.
Presenter Tip: These topics can be a bit complicated! We recommend brushing up on APIs and learning a bit more about minimal APIs by taking this self-guided tutorial on Microsoft Learn: https://docs.microsoft.com/learn/modules/build-web-api-minimal-api/
With Minimal APIs, the task of creating an API is much simpler! You can get started with just a few lines of code.
Presenter Tip: Here, it may be helpful to pause and answer questions. In the next few slides, you'll get into the exercise!
If you are in Visual Studio Code, you can do this using the built-in Terminal. You can also use your command prompt.
There is an optional –minimal flag flag for the dotnet new web template. We're not going to use that here for the following reasons:
If you use -minimal it sets up swashbuckle and a sample weather forecast API, but it's actually 5x more code than if you don't use the -minimal flag.
Using dotnet new web without -minimal includes a default route you can browse to, which is nicer experience for beginners.
Presenter tip: Here, it will be helpful to show how you are completing the task. We recommend opening up Visual Studio Code and completing these steps as you go along.
Snippet 1:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
Snippet 2:
app.MapGet("/todo", () => new { Item = "Water plants", Complete = "false" });
Snippet:
app.MapGet("/todos/{id}", async (TodoDb db, int id) => await db.Todos.FindAsync(id));
Snippet:
app.MapPut("/todos/{id}", async ( TodoDb db, TodoItem updateTodo ,int id) =>
{
var todo = await db.Todos.FindAsync(id);
if (todo is null) return Results.NotFound();
todo.Item = updateTodo.Item;
todo.IsComplete = updateTodo.IsComplete;
await db.SaveChangesAsync();
return Results.NoContent();
});
Presenter Tip:
Pause and ask for any questions. In the next few slides, we'll move on to our next topic: connecting to a database.
Snippet:
app.MapDelete("/todos/{id}", async (TodoDb db, int id) =>
{
var todo = await db.Todos.FindAsync(id);
if (todo is null)
{
return Results.NotFound();
}
db.Todos.Remove(todo);
await db.SaveChangesAsync();
return Results.Ok(todo);
});