No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Mostrar favoritos

22/25
Recursos

Aportes 22

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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.

cuando le doy en ver favoritos me sale:![](https://static.platzi.com/media/user_upload/image-6d577ec0-d31c-4914-ad17-b250843cdac2.jpg)
Solo diré una palabra... PEEEENCAAAA! Una perdida de tiempo este curso. Saludos.

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