M2 ‐ Creación de un Web Service RESTful - sjperalta/Web-Service-C-sharp GitHub Wiki
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.
- Instale .NET 8.0 SDK
- Instale un editor de texto, como Visual Studio Code
-
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
-
-
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.
-
-
Ejecutar la aplicación:
-
Para iniciar la aplicación en el perfil https, ejecute:
dotnet run --launch-profile https
-
-
Cree una carpeta llamada
Models
y agregue un archivoTodoItem.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; } } }
-
Cree una carpeta llamada
Data
y agregue un archivoTodoContext.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 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:
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.
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 (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.
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.
- 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#.
[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);
}