En está ocasión crearemos un proyecto webapi con ASP .NET Core mediante la herramienta ``dotnet``. Si no la tienes instalada puedes ir a este sitio:
https://dotnet.microsoft.com/es-es/download¿Qué haremos? Un servicio API para obtener el nuevo sueldo de un empleado de acuerdo a estos datos de entrada: id, nombre, sueldo base, edad, género y estado civil. Por el momento no usaremos alguna base de datos. Las condiciones a cumplir para el nuevo sueldo son las siguientes:
IF estado_civil == "casado" THEN bono25Porciento(); ELSE bono10Porciento(); END IF; IF sueldo_base <= 20000 THEN aumentoSueldo25Porciento(); ELSE IF sueldo_base > 25000 THEN aumentoSueldo5Porciento(); END IF; END IF;
El servicio tomará los datos del usuario (id, nombre, sueldo base, edad y género) y con base a las condiciones dará un aumento. Como se puede ver no tiene mucha ciencia entender lo que queremos realizar.
Abrimos una terminal y creamos el proyecto:
$ dotnet new web -o SueldoNuevo $ cd SueldoNuevo $ code -r ../SueldoNuevo
Esto nos creará el proyecto, nos ubicará en el directorio y abrirá Visual Studio Code. Abrimos el programa principal y lo editamos:
Program.cs
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("/", () => "Sueldo nuevo en C#"); app.Run();
Ejecutamos con este comando:
$ dotnet run
Abrimos el navegador en la ruta: http://localhost:5048
Salida:
Sueldo nuevo en C#
Como queremos hacer una aplicación modular, crearemos una carpeta Model y ahí tendremos una clase llamada Empleado.cs.
using System; namespace Model { public class Empleado { public int Id { get;set; } public string Nombre { get; set; } public int Edad { get; set; } public double SueldoBase { get; set; } public bool isCasado { get;set; } public string Genero { get; set; } public Empleado() { Id = 0; Nombre = string.Empty; SueldoBase = 0.0; Edad = 0; isCasado = false; Genero = string.Empty; } } }
Ahora creamos un directorio denominado como Services. Dentro crearemos una interface llamada IEmpleadoService.cs y una clase que la implementa llmada EmpleadoService.cs.
IEmpleadoService.cs
using System; using Model; namespace Services { public interface IEmpleadoService { double GetNuevoSueldo(Empleado empleado); } }
EmpleadoService.cs
using System; using Model; namespace Services { public class EmpleadoService: IEmpleadoService { public double GetNuevoSueldo(Empleado empleado) { var sueldoFinal = empleado.SueldoBase; if (empleado.isCasado) { sueldoFinal += empleado.SueldoBase + 0.25; }else { sueldoFinal += empleado.SueldoBase + 0.10; } if (empleado.SueldoBase <= 20000) { sueldoFinal += empleado.SueldoBase + 0.25; }else if (empleado.SueldoBase > 25000) { sueldoFinal += empleado.SueldoBase + 0.05; }else { sueldoFinal += empleado.SueldoBase + 0.01; } return sueldoFinal; } } }
Ahora implementaremos la lógica descrita en el pseudo código de arriba. Modificamos el programa principal:
Program.cs
using Model; using Services; var builder = WebApplication.CreateBuilder(args); // Registro del servicio en el contenedor de DI builder.Services.AddScoped<IEmpleadoService, EmpleadoService>(); var app = builder.Build(); app.MapGet("/", () => "Sueldo nuevo en C#"); // Endpoint que usa el servicio inyectado app.MapPost("/calcular", (Empleado empleado, IEmpleadoService empleadoService) => { double nuevoSueldo = empleadoService.GetNuevoSueldo(empleado); return new { empleado.Nombre, SueldoBase = empleado.SueldoBase, SueldoFinal = nuevoSueldo }; }); app.Run();
¿Qué podemos notar en este programa?
- Hemos inyectado la clase servicio (EmpleadoService) de manera similar a lo que se hace con
@Autowiredde Spring Boot. - Hemos creado un endpoint con la lógica del servicio inyectado.
Para hacer una petición al servicio crearemos un script con Powershell:
nuevosueldo.ps1
$body = @{ Id = 1 Nombre = "Pedro Ramírez" Edad = 35 SueldoBase = 18000 isCasado = $true Genero = "M" } | ConvertTo-Json Invoke-RestMethod -Uri "http://localhost:5048/calcular" ` -Method Post ` -ContentType "application/json" ` -Body $body
Si tenemos curl, podemos hacerlo de esta forma:
curl -X POST http://localhost:5048/calcular \ -H "Content-Type: application/json" \ -d '{ "Id": 1, "Nombre": "Pedro Ramírez", "Edad": 35, "SueldoBase": 18000, "isCasado": true, "Genero": "M" }'
Ejecutamos con este comando:
$ dotnet run
Ejecutamos el script:
$ .\nuevosueldo.ps1
Si todo va bien, la salida será la siguiente:
nombre sueldoBase sueldoFinal ------ ---------- ----------- Pedro Ramírez 18000 54000.5
UPDATE: También podemos hacer peticiones con una archivo *.http. Crearemos uno en el directorio principal y lo nombraremos MyRequests.http. Tendrá el siguiente contenido:
POST http://localhost:5048/calcular Content-Type: application/json { "Id": 1, "Nombre": "Pedro Ramírez", "Edad": 35, "SueldoBase": 18000, "isCasado": true, "Genero": "M" } GET http://localhost:5048/
Si todo va bien, veremos este resultado:
¡Hemos creado un sencillo servicio api con C#!
Conclusión:
Creamos una aplicación webapi con C# desde la herramienta dotnet.
Aprendimos como se puede dividir la aplicación modularmente (directorios Model y Services).
Como implementar métodos de una interface C# (IEmpleadoService.cs y EmpleadoService.cs)
Como usar inyección de dependencia similar a lo que se hace con Spring Boot.
Como hacer una petición al servicio usando un script de Powershell y/o curl. Además del archivo *.http
Lo que sigue es usar una Base de datos (MS SQL Server, Maria DB, PostrgeSQL, etc.) y tablas para replicar esa funcionalidad, pero lo haremos en otra ocasión.
Enlaces:
https://learn.microsoft.com/es-es/aspnet/core/tutorials/min-web-api?view=aspnetcore-10.0&tabs=visual-studio-codehttps://dotnet.microsoft.com/es-es/apps/aspnet/apis



No hay comentarios:
Publicar un comentario