Ticker

6/recent/ticker-posts

ASP.NET Core - Crear Web API con C# y EF

Que tal a todos, hoy quiero compartirles acerca de la creación de Web API con C# y EF, bueno comencemos con algo de explicación acerca de la arquitectura que se detalla en el diagrama (gráfica) de despliegue. La arquitectura esta compuesto básicamente por 4 nivel de infraestructura, quiere decir que se inicia con la interfaz del cliente, la Web API como tal, el servidor de aplicaciones donde se encuentra alojado la Web API y finalmente con el con el servidor  de base de datos donde se encuentra alojado la base de datos.
Mencionar que esta arquitectura esta basado para On-Premise (en local), quiere decir que los servidores de aplicación y base de datos estarán dentro de la infraestructura de la organización (no cloud computing).
Antes de iniciar el ejemplo práctico sugiero que revisen el articulo acerca de Qué son las API, características de WEB API, del por qué elegir el uso de WEB API, tipos de API y los enfoques con respecto a las políticas.

Requisitos para nuestro primer demo:

  1. Microsoft Visual Studio Community 2019
  2. .Net Core 3.1
  3. Microsoft Entity Framework Core
  4. Postman

Crear Solución:

Se puede crear directamente el proyecto y al mismo tiempo se crear la solución, sin embargo para familiarizarnos con la nueva versión del IDE VS2019 crearemos paso a paso la solución y respectivamente el proyecto.

Selecciona solución en blanco y clic en siguiente
Ingrese el nombre de WEB_API_CORE y clic en Crear

Crear Proyecto Web API:

Seguidamente clic derecho en la solución y seleccionar agregar nuevo proyecto, y ubicamos el tipo de proyecto Aplicación web ASP.NET Core.

Seleccionamos Aplicación web ASP.NET Core y clic en Siguiente
Ingresamos el nombre y clic en Crear
Seleccionar ASP.NET Core 3.1 y para finalizar clic en Crear

Crear Modelo:

Para crear nuestro modelo, se agregará la carpeta de nombre Models en la raíz del proyecto creado (clic derecho, agregar carpeta):

Carpeta creado
Luego se agregará una clase de nombre ClsPersona.cs (clic derecho en la carpeta Models y agregar clase)
Seguidamente se agregara los siguiente atributos en la clase (representa el modelo Persona) ClsPersona.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace WEB_API_CORE.Models
{
    public class ClsPersona
    {
        public long id { get; set; }
        public string nombre { get; set; }
        public string apellido { get; set; }
        public string sexo { get; set; }
        public string dni { get; set; }
    }
}

Microsoft Entity Framework Core InMemory:

Qué es Microsoft.EntityFrameworkCore.InMemory: Proveedor de base de datos que permite usar Entity Framework Core con una base de datos en memoria, que sirve especialmente para realizar pruebas.
Instalar EF Core InMemory: Desde la consola de administración de paquetes de NuGet, clic en el menú herramientas, administración de paquetes NuGet y por último clic en consola del administración de paquetes e ingresar las siguiente línea Install-Package Microsoft.EntityFrameworkCore.InMemory -Version 3.1.1

Instalando EF Core InMemory

Microsoft Entity Framework Core SqlServer:

Qué es Microsoft.Entity.Framework.Core.SqlServer: Proveedor de base de datos que permite usar Entity Framework Core con Microsoft SQL Server incluido SQL Azure:
Instalar EF Core SqlServer: Desde el administración de paquetes NuGet para solución, clic en el menú herramientas, administración de paquetes NuGet y por último clic en administración de paquetes NuGet para solución... realiza la búsqueda desde la pestaña examinar e ingresar Microsoft.EntityFrameworkCore.SqlServer, después de ubicar clic en proyecto y clic en instalar.
Instalando EF Core SqlServer
Al concluir la instalación de Microsoft.Entity.Framework.Core.SqlServer automáticamente se creara el ya conocido CRUD, es decir se crearan los siguiente métodos en la clase  Controllers (ClsPersonasController.cs):


using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using WEB_API_CORE.Models;

namespace WEB_API_CORE.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ClsPersonasController : ControllerBase
    {
        private readonly ClsPersonaContext _context;

        public ClsPersonasController(ClsPersonaContext context)
        {
            _context = context;
        }

        // GET: api/ClsPersonas
        [HttpGet]
        public async Task<ActionResult<IEnumerable<ClsPersona>>> GetClsPersonas()
        {
            return await _context.ClsPersonas.ToListAsync();
        }

        // GET: api/ClsPersonas/5
        [HttpGet("{id}")]
        public async Task<ActionResult<ClsPersona>> GetClsPersona(long id)
        {
            var clsPersona = await _context.ClsPersonas.FindAsync(id);

            if (clsPersona == null)
            {
                return NotFound();
            }

            return clsPersona;
        }

        // PUT: api/ClsPersonas/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for
        // more details see https://aka.ms/RazorPagesCRUD.
        [HttpPut("{id}")]
        public async Task<IActionResult> PutClsPersona(long id, ClsPersona clsPersona)
        {
            if (id != clsPersona.id)
            {
                return BadRequest();
            }

            _context.Entry(clsPersona).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!ClsPersonaExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return NoContent();
        }

        // POST: api/ClsPersonas
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for
        // more details see https://aka.ms/RazorPagesCRUD.
        [HttpPost]
        public async Task<ActionResult<ClsPersona>> PostClsPersona(ClsPersona clsPersona)
        {
            _context.ClsPersonas.Add(clsPersona);
            await _context.SaveChangesAsync();

            return CreatedAtAction("GetClsPersona", new { id = clsPersona.id }, clsPersona);
        }

        // DELETE: api/ClsPersonas/5
        [HttpDelete("{id}")]
        public async Task<ActionResult<ClsPersona>> DeleteClsPersona(long id)
        {
            var clsPersona = await _context.ClsPersonas.FindAsync(id);
            if (clsPersona == null)
            {
                return NotFound();
            }

            _context.ClsPersonas.Remove(clsPersona);
            await _context.SaveChangesAsync();

            return clsPersona;
        }

        private bool ClsPersonaExists(long id)
        {
            return _context.ClsPersonas.Any(e => e.id == id);
        }
    }
}

Todo esto ocurre porque se esta haciendo uso del ORM (Object-relational mapper) Entity Framework nos olvidamos de estar creando manualmente nuestro código (una buena alternativa para realizar pruebas - en lo personal no uso mucho ORMs prefiero hacer uso de ADO.Net).

Testear con Postman:

Postman permite el envío de peticiones HTTP sin necesidad de desarrollar un cliente, iniciemos  nuestro test:
Ingresamos los datos con e verbs de tipo POST, ingresamos los datos en el Body del application/json y clic en Send
Consultamos los datos con el verbs de tipo GET, e ingresamos 1 en la url ..api/ClsPeronas/1  y clic en Send
Modifica los datos con el verbs de tipo PUT, modifica el nombre en el Body del application/json y clic en Send
Puede seguir implementando y testeando los otros método de petición HTTP verbs y recordemos los métodos más relevantes son:
POST: crear un recurso nuevo.
PUT: modificar un recurso existente.
GET: consultar información de un recurso.
DELETE: eliminar un recurso determinado.
PATCH: modificar solamente un atributo de un recurso.

Conclusión:

En definitivo las Web APIs no es complicado de implementar, y la flexibilidad que nos ofrece es su principal ventaja y uso que reside en la independencia que proporciona frente a cualquier consumidor, sin considerar el lenguaje o plataforma con el que se acceda a ella. Permitiendo que una misma API REST (también se puede resolver de tipo XML) sea consumida por infinidad de clientes sea cual sea la naturaleza de estos y que el cambio a cualquier otro tipo de consumidor no provoque impacto alguno.

ASP.NET Core - Web API con C# y Entity Framework
Nuevamente agradecer de antemano por la revisión y lectura de este pequeño post, nos vemos en el siguiente tutorial.

Publicar un comentario

3 Comentarios

  1. muy interesante el ejercicio.
    Sería importante también si tienes alguna publicación de wep api con ado.net.
    Muchas Gracias !!!

    ResponderBorrar
    Respuestas
    1. Ya esta disponible Web API en ASP.NET con ADO.Net espero te sea útil:
      http://blog.hadsonpar.com/2020/09/crear-web-api-en-aspnet-con-adonet.html

      Borrar
  2. Hola que tal un gusto saludarte...
    En realidad ya tenemos implementado el ejercicio de web api con ado.net, sin embargo aún esta pendiente en elaborar la publicación. Te estaré dejando el link en esta misma secuencia en cuanto termino de redar para la publicación.

    Que tengas un excelente día y gracias por el interés.

    ResponderBorrar