Creo que es redundante tener el código que descarga las imágenes, mas de una vez, lo mejor sería meterlo en un método y que devuelva una imagen.
Conocer y entender la persistencia de datos
¿Cómo empezar? Persistencia de datos y bases de datos relacionales
Conociendo algunas bases de datos relacionales: MySQL, PostgreSQL, Oracle
Diseñar y crear BD
Instalación de MySQL
Diseñando nuestra base de datos
Creando nuestra base de datos usando DDL
Instalación de Netbeans
Realizar operaciones CRUD y generar conexión
Creación del proyecto en Java
Conexión a MySQL desde Java
Control de versiones con Git y GitLab
Flujo y lógica de la aplicación
CRUD: inserción de datos
CRUD: lectura de datos
CRUD: eliminación de datos
CRUD: actualización de datos
Persistencia en API rest
API REST y métodos HTTP
Conociendo algunas APIs
Creación del proyecto y API KEY
Listando datos de APIs públicas
Mostrar datos de la API en la aplicación
Guardando datos en APIs públicas
Listar datos guardados
Mostrar favoritos
Eliminar datos de la API
Cierre del curso y próximos pasos
¿Qué aprender ahora?
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Aportes 22
Preguntas 4
Creo que es redundante tener el código que descarga las imágenes, mas de una vez, lo mejor sería meterlo en un método y que devuelva una imagen.
Estoy en 2022 haciendo el curso y todo los video estan desactualizados, y desordenados porque salte de BD a Programación y de ahi a otra herramientes y de nuevo a BD , seria bueno dar un orden y actualizar los cursos ya que en 2 años que tiene los videos mas actuales hay muchos cambios y creo que hay gente en youtube que tiene actualizaciones y ordenado el curso.
Si me dicen recomendarías la plataforma digo no
Asuuu que desorden, jeje, refactoricen urgente xd
Todavía no se ha cambiando el vídeo, sigue estando repetido.
Interesante ya veo porque fue necesario quitar las llaves en el proceso anterior, pero yo no hubiera copiado y pegado el código de ver gatos fuera implementado eso en una función a parte para que ambos procesos consuman esa función y el código sea mas fácil de mantener.
Obs:
Los atributos de Json tienen que ser el mismo en la clase que se crea.
Se aprende también del desorden. Considero innecesario mostrar los favoritos de forma aleatoria. De resto bien
Don’t repeat yourself 😕
Todo genial y funciona perfectamente. El unico problema es el codigo xD, como muchos dicen ese copia y pega no va y es una filosofia en la programacion, aqui porque es didactivo y corto, pero en un proyecto seria horrible.
¿Tra vez el error grave de un llamado recursivo? C reo que hay que ponerle atención a este curso, es más volverlo a hacer.
Este video ya esta como “Guardando datos en APIs publicas”
Excelente, ahora mediante estos ajustes podremos ver las imágenes de gatos favorito que hayamos seleccionado. Muchas gracias instructor Santiago.
Tantas cosas que se pueden hacer con funciones para respetar el DRY
Con este if, los gatos dejan de estar en aleatorio… Cabe destacar que tengo una public static int indexCat
FavouriteCat[] catsFavorite = gson.fromJson(jsonData, FavouriteCat[].class);
if (catsFavorite.length > 0){
if (indexCat == catsFavorite.length) {
indexCat = 0;
}
FavouriteCat favouriteCat = catsFavorite[indexCat];
indexCat++;
Al igual que otros compis he puesto un for para recorrer los favotioss en vez de un numero aleatorio:
public static void showFavorites(String api_key) throws IOException {
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
Request request = new Request.Builder().url("https://api.thecatapi.com/v1/favourites").get()
.addHeader("Content-Type", "application/json").addHeader("x-api-key", api_key).build();
Response response = client.newCall(request).execute();
System.out.println("Mostrando favoritos");
String respJson = response.body().string();
// Gson
Gson gson = new Gson();
CatsFav[] catsArray = gson.fromJson(respJson, CatsFav[].class);
if (catsArray.length > 0) {
for (CatsFav cat : catsArray) {
// Crear una variable para almacenar la imagen
Image img = null;
try {
// Crear un objeto URL a partir de la URL de la imagen en la respuesta JSON
URL url = new URL(cat.getImage().getUrl());
// Leer la imagen desde la URL
img = ImageIO.read(url);
// Crear un ImageIcon con la imagen obtenida
ImageIcon catBackground = new ImageIcon(img);
// Si el ancho de la imagen es mayor a 800, redimensionarla
if (catBackground.getIconWidth() > 800) {
Image background = catBackground.getImage();
Image newBackground = background.getScaledInstance(800, 600, java.awt.Image.SCALE_SMOOTH);
catBackground = new ImageIcon(newBackground);
}
String menu = "Opciones:\n" + "1- Ver otra imagen\n" + "2- Eliminar favorito\n" + "3- Volver";
String[] botones = { "ver otra imagen", "eliminar de favoritos", "volver" };
String idCat = cat.getId();
String opcion = (String) JOptionPane.showInputDialog(null, menu, idCat,
JOptionPane.INFORMATION_MESSAGE, catBackground, botones, botones[0]);
int seleccion = -1;
for (int i = 0; i < botones.length; i++) {
if (opcion.equals(botones[i])) {
seleccion = i;
}
}
switch (seleccion) {
case 0:
//showFavorites(api_key);
break;
case 1:
delFavoriteCat(cat);
break;
case 2:
break;
default:
System.out.println("Opcion no valida");
break;
}
} catch (Exception e) {
// Imprimir un mensaje de error si hay algún problema al formatear la imagen
System.out.println("Error al formatear imagen");
}
}
}
}
para no tener codigo redundante en las descargas de las imagenes, utilicé el siguiente metodo:
pd: estoy utilizando The Dog API
public static ImageIcon redimensionarImagen(String url, int anchoMaximo, int altoMaximo) {
try {
URL imageUrl = new URL(url);
HttpURLConnection http = (HttpURLConnection) imageUrl.openConnection();
http.addRequestProperty("User-Agent", "");
BufferedImage imagenOriginal = ImageIO.read(http.getInputStream());
ImageIcon imagen = new ImageIcon(imagenOriginal);
int anchoOriginal = imagen.getIconWidth();
int altoOriginal = imagen.getIconHeight();
if (anchoOriginal > anchoMaximo || altoOriginal > altoMaximo) {
double proporcionAncho = (double) anchoMaximo / anchoOriginal;
double proporcionAlto = (double) altoMaximo / altoOriginal;
double proporcionRedimension = Math.min(proporcionAncho, proporcionAlto);
int anchoRedimensionado = (int) (anchoOriginal * proporcionRedimension);
int altoRedimensionado = (int) (altoOriginal * proporcionRedimension);
Image imagenRedimensionada = imagenOriginal.getScaledInstance(anchoRedimensionado, altoRedimensionado, java.awt.Image.SCALE_SMOOTH);
imagen = new ImageIcon(imagenRedimensionada);
}
return imagen;
} catch (IOException e) {
System.out.println(e);
return null;
}
}
Y para usar este método en elcódigo, reemplaza el bloque de código que redimensiona la imagen actualmente con una llamada a este método
el bloque sería
y para llamarlo
ImageIcon fondoPerrito = redimensionarImagen(perroFav.image.getUrl(), 800, 600);
Yo lo hice algo diferente para que muestre los favoritos en orden:
public static void seeFavoriteCats() {
try {
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "");
Request request2 = new Request.Builder()
.url("https://api.thecatapi.com/v1/favourites")
.get()
.addHeader("x-api-key", APIKey.getApikey())
.build();
Response response2 = client.newCall(request2).execute();
String theJson2 = response2.body().string();
Gson gson2 = new Gson();
FavoriteCat[] favoriteCatsArray = gson2.fromJson(theJson2, FavoriteCat[].class);
if (favoriteCatsArray.length > 0) {
for (FavoriteCat currentCat : favoriteCatsArray) {
try {
URL url = new URL(currentCat.image.getUrl());
HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();
httpcon.addRequestProperty("User-Agent", "");
BufferedImage bufferedImage = ImageIO.read(httpcon.getInputStream());
ImageIcon background = new ImageIcon(bufferedImage);
if (background.getIconWidth() > 800) {
Image modified = background.getImage().getScaledInstance(800, 600, Image.SCALE_SMOOTH);
background = new ImageIcon(modified);
}
String menu = "Options: \n" +
"1. Delete as favorite\n" +
"2. See next cat\n" +
"3. Go back";
String[] buttons = {"Delete as favorite", "See next cat", "Go back"};
String catID = String.valueOf(currentCat.image.getId());
String option = (String) JOptionPane.showInputDialog(null, menu, catID, JOptionPane.INFORMATION_MESSAGE, background, buttons, buttons[0]);
int selection = -1;
for (int i = 0; i < buttons.length; i++) {
if (option.equals(buttons[i])) {
selection = i;
}
}
switch (selection) {
case 0:
deleteCatAsFavorite();
break;
case 1: break;
default: System.exit(0);
}
} catch (IOException e) {
System.out.println(e);
}
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
El problema de llamar el método recursivamente es que va a volver a llamar todos los datos a través de la api y a hacer muchas cosas de manera innecesaria.
Estudiantes, actualicé el proyecto en mi repositorio aplicando mejores prácticas
Listo!
Preferí solo listar los gatitos agregados a favoritos.
La idea seria después hacer refactor para aplicar POO y DRY
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?