static async Task Main(string[] args)
{
// URL del JSON
string url = "https://jsonplaceholder.typicode.com/posts";
// Leer el JSON de la URL
var json = await ObtenerJsonDesdeUrl(url);
// Deserializar el JSON en un tipo anónimo
var datos = JsonSerializer.Deserialize<dynamic>(json, new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
});
// Iterar y mostrar datos
foreach (var elemento in datos)
{
Console.WriteLine($"ID: {elemento.id}, Título: {elemento.title}");
}
}
// Método para obtener el JSON desde una URL
public static async Task<string> ObtenerJsonDesdeUrl(string url)
{
using HttpClient client = new HttpClient();
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode(); // Lanza excepción si el estado no es 2xx
return await response.Content.ReadAsStringAsync();
}
}
Mockup
using CapaServicio.Controllers;
using CapaServicio.Models;
using CapaServicio.Repository;
using CapaServicio.Service;
using Microsoft.AspNetCore.Mvc;
using Moq;
namespace CapaTest
{
public class UnitTest1
{
private Mock<IAlumnoService> _mockService;
private AlumnoesController _controller;
public UnitTest1()
{
// Crear el mock del servicio y configurar su comportamiento
_mockService = new Mock<IAlumnoService>();
// Esto son datos falsos de prueba que será lo que obtengamos cuando
// El controlador llame al servicio
_mockService.Setup(s => s.ObtenerTodos()).Returns(new List<Alumno> { new Alumno(), new Alumno() });
_mockService.Setup(s => s.ObtenerPorId(2)).Returns(new Alumno());
//// Crear una instancia del controlador con el mock del servicio
_controller = new AlumnoesController(_mockService.Object);
}
[Fact]
public async Task Test1Async()
{
// Aquí verifico el index
var result = await _controller.Index() as ViewResult;
// Verificar
Assert.NotNull(result);
// Compruebo, por ejemplo, que el modelo es una lista de alumnos
Assert.IsType(typeof(List<Alumno>), result.Model);
Assert.Equal(2, ((List<Alumno>)result.Model).Count);
// Aquí verifico el Details con un id 2
result = await _controller.Details(2) as ViewResult;
Assert.NotNull(result);
// Compruebo que el modelo sea alumno...
Assert.IsType(typeof(Alumno), result.Model);
}
}
}
Ejercicio
Esta clase:
public static class Solver
{
public static (double? x1, double? x2) segundoGrado(double a, double b, double c)
{
if(a == 0 && b == 0)
{
return (null,null);
}
double discriminante = b * b - 4 * a * c;
if (discriminante<0)
{
return (null, null);
}
return (0, 0);
}
}
Cread un proyecto que tenga esta clase y una clase de test que compruebe que funciona. Con Fact y con Theory
Números complejos
https://github.com/juanpablofuentes/Pasiona/blob/master/Ejemplos01/NumerosComplejos/NumeroComplejo.cs
Ejercicio Pokemons
1.- En el mantenimiento de pokemons que pueda acceder cía el menú, que se vea el nombre de la categoría en el desplegable y que cuando acceda a una categoría vea todos sus pokemons relacionados (solo el nombre) pero que cada uno tenga un enlace pra poder ver el detalle
2.- Crear una API para categorias y pokemons
3.- Si da tiempo: Que en el pokemon salga en la api todos los datos de su categoría y en la categoría una lista de los pokemons SIN la categoría
4.- Hacer un endpoint get categoria/{id}/pokemons que nos devuelva una lista de los pokemons de esa categoría
5.- En el endpoint categoria/{id}/pokemons si hacemos una petición post pasando los datos de un pokemon que nos añada ese pokemon nuevo con esa categoría
Swagger en API
Instalar el paquete siguiente:
Install-Package Swashbuckle.AspNetCore -Version 6.6.2
Habilitar esto en program:
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
APIs de ejemplo
https://jsonplaceholder.typicode.com/guide/
Vamos a consultar libros y artículos del nytimes. Aquí hay la lista de las apis:
https://developer.nytimes.com/apis
Yo me he creado una apikey: SFq0lnJwGzV4X8XyqV2kQvA3LgKAp3kN
Pero os podéis crear la vuestra.
Me gustaría que, desde el postman, accediéramos a la lista de los libros más vendidos y a los artículos de los tres últimos meses.
También podéis crear vuestra propia apikey y acceder, por ejemplo, a películas.
Ejercicio Pokemon
Vamos a crear una base de datos para almacenar mi colección de pokemons
Tendremos las siguientes tablas:
Categoría: id, nombre, descripcion
Pokemon: id, nombre,descripcion,tipo de energ´ía, categoría
Haremos un MVC que tenga un mantenimiento de la base de datos.
En el HomeController poned enlace al mantenimiento de categorías y al mantenimiento de pokemons.
Ejercicio controladores
using Microsoft.AspNetCore.Mvc;
using MVC01.Models;
namespace MVC01.Controllers
{
public class CursoController : Controller
{
private readonly Contexto _context;
public CursoController(Contexto context)
{
_context = context;
}
public IActionResult Index()
{
// Recuperar los datos de todos los cursos
// Los vais a pasar a la vista
// En la vista mostráis la información (id,nombre,descripcion)
return View();
}
public IActionResult AddCurso()
{
// Llamar a una vista con un formulario
// Para poner nombre y descripción
return View();
}
public IActionResult NewCurso(Curso curso)
{
// Capturamos los datos del formulario
// Y lo añadimos a la base de datos
return View();
}
}
}
MVC + Consultas
Vamos a crear un controlador ConsultasController sobre la escuela. Tendrá las siguientes acciones:
Cursos
Nos mostrará la lista de cursos que tengan alumnos matriculados
Alumnos
Nos mostrará la lista de alumnos que estén matriculados en más de un curso
Direcciones
Nos mostrará la lista de alumnos que tengan más de una dirección
TotalPorCiudad
Nos mostrará el número de direcciones que tiene cada ciudad. Aquí tenemos una cadena y un número ¿Cómo lo haremos?
AlumnosCiudad
Nos mostrará los alumnos que sean de la ciudad que tiene más direcciones.