¿Cómo creamos un menú para interactuar con la API de Cat Happy?
Este contenido explora cómo crear un menú interactivo en Java para gestionar imágenes de gatos desde la API de Cat Happy. Este proceso es esencial para quienes desean desarrollar aplicaciones interactivas basadas en datos externos, aplicando conceptos de programación orientada a objetos y buenas prácticas en el manejo de excepciones.
¿Cómo estructuramos el menú?
Primero, necesitas definir las opciones del menú que ofrecerás a los usuarios. Es importante que las opciones sean claras y accionables para guiar correctamente la experiencia del usuario.
Define un String llamado menu que contenga las opciones de elección para el usuario. Puedes utilizar el carácter \n para listar cada opción en una nueva línea.
Crea un arreglo de String llamado botones donde almacenarás estas opciones para su posterior uso en la interfaz gráfica.
String menu ="Opciones:\n"+"1. Ver otra imagen\n"+"2. Marcar el gato como favorito\n"+"3. Volver al menú";String[] botones ={"Ver otra imagen","Favorito","Volver"};
¿Cómo presentamos las opciones al usuario?
Para presentar estas opciones al usuario, usaremos un cuadro de diálogo que permite seleccionar entre ellas:
Usa JOptionPane.showInputDialog para desplegar un cuadro de diálogo que muestre las opciones del menú y espere una respuesta del usuario.
El cuadro de diálogo debe mostrar la imagen del gato y las opciones de interacción.
int opcion =JOptionPane.showOptionDialog(null, menu,"ID de la imagen: "+ gato.getId(),JOptionPane.INFORMATION_MESSAGE,null, botones, botones[0]);
¿Cómo gestionamos las selecciones del usuario?
Con cada opción seleccionada, debes tener un flujo definido para manejar la interacción del usuario. Utiliza estructuras de control como switch para definir acciones específicas según la opción elegida.
La opción 0 podría generar una nueva llamada a la API para revisar otra imagen.
La opción 1 llama un método favoritoGato que marca al gato actual como favorito.
La opción 2 podría redirigir al usuario al menú principal o cerrar la aplicación.
switch(opcion){case0:verOtraImagen();break;case1:favoritoGato(gato);break;// Otros casos pueden incluir un default para manejar selecciones no deseadasdefault:System.out.println("Opción no válida.");break;}
¿Qué errores comunes podemos encontrar y cómo solucionarlos?
En la programación, el manejo de errores es crucial para asegurar una experiencia fluida y sin interrupciones. Uno de los errores comunes es la conversión incorrecta de tipos de datos, especialmente cuando se manejan IDs o identificadores únicos.
Comprueba que el tipo de datos coincida con la definición en el modelo. Si en la base de datos o en la API el ID está como String, debe reflejarse igual en el modelo Java.
Revisa y prueba la aplicación después de realizar cualquier cambio. Utiliza herramientas de pruebas como Postman para validar la correcta recepción y envío de datos.
// Ajuste en el modelo cuando el ID es un StringpublicclassGato{privateString id;// Cambiado de int a String// getters y setters correspondientes}
Mantente atento a cómo el usuario interactúa con la interfaz y optimiza el flujo según la experiencia que desees proporcionar. Con cada clase y ejecución, se robustecen las aplicaciones, acercándote más a una implementación completa y funcional. ¡Continúa explorando, construyendo, y perfeccionando tus habilidades en programación!
Creación de Menú Interactivo para Visualizar Imágenes de Gatos
Creación de Menú Interactivo para Visualizar Imágenes de Gatos
Recursos
Resumen
¿Cómo creamos un menú para interactuar con la API de Cat Happy?
Este contenido explora cómo crear un menú interactivo en Java para gestionar imágenes de gatos desde la API de Cat Happy. Este proceso es esencial para quienes desean desarrollar aplicaciones interactivas basadas en datos externos, aplicando conceptos de programación orientada a objetos y buenas prácticas en el manejo de excepciones.
¿Cómo estructuramos el menú?
Primero, necesitas definir las opciones del menú que ofrecerás a los usuarios. Es importante que las opciones sean claras y accionables para guiar correctamente la experiencia del usuario.
Define un String llamado menu que contenga las opciones de elección para el usuario. Puedes utilizar el carácter \n para listar cada opción en una nueva línea.
Crea un arreglo de String llamado botones donde almacenarás estas opciones para su posterior uso en la interfaz gráfica.
String menu = "Opciones:\n" +
"1. Ver otra imagen\n" +
"2. Marcar el gato como favorito\n" +
"3. Volver al menú";
String[] botones = {"Ver otra imagen", "Favorito", "Volver"};
¿Cómo presentamos las opciones al usuario?
Para presentar estas opciones al usuario, usaremos un cuadro de diálogo que permite seleccionar entre ellas:
Usa JOptionPane.showInputDialog para desplegar un cuadro de diálogo que muestre las opciones del menú y espere una respuesta del usuario.
El cuadro de diálogo debe mostrar la imagen del gato y las opciones de interacción.
int opcion = JOptionPane.showOptionDialog(
null,
menu,
"ID de la imagen: " + gato.getId(),
JOptionPane.INFORMATION_MESSAGE,
null,
botones,
botones[0]
);
¿Cómo gestionamos las selecciones del usuario?
Con cada opción seleccionada, debes tener un flujo definido para manejar la interacción del usuario. Utiliza estructuras de control como switch para definir acciones específicas según la opción elegida.
La opción 0 podría generar una nueva llamada a la API para revisar otra imagen.
La opción 1 llama un método favoritoGato que marca al gato actual como favorito.
La opción 2 podría redirigir al usuario al menú principal o cerrar la aplicación.
switch(opcion) {
case 0:
verOtraImagen();
break;
case 1:
favoritoGato(gato);
break;
// Otros casos pueden incluir un default para manejar selecciones no deseadas
default:
System.out.println("Opción no válida.");
break;
}
¿Qué errores comunes podemos encontrar y cómo solucionarlos?
En la programación, el manejo de errores es crucial para asegurar una experiencia fluida y sin interrupciones. Uno de los errores comunes es la conversión incorrecta de tipos de datos, especialmente cuando se manejan IDs o identificadores únicos.
Comprueba que el tipo de datos coincida con la definición en el modelo. Si en la base de datos o en la API el ID está como String, debe reflejarse igual en el modelo Java.
Revisa y prueba la aplicación después de realizar cualquier cambio. Utiliza herramientas de pruebas como Postman para validar la correcta recepción y envío de datos.
// Ajuste en el modelo cuando el ID es un String
public class Gato {
private String id; // Cambiado de int a String
// getters y setters correspondientes
}
Mantente atento a cómo el usuario interactúa con la interfaz y optimiza el flujo según la experiencia que desees proporcionar. Con cada clase y ejecución, se robustecen las aplicaciones, acercándote más a una implementación completa y funcional. ¡Continúa explorando, construyendo, y perfeccionando tus habilidades en programación!
Si llegaron al final de este video y no les muestra la imagen del gato y encima les sale un error como este: "Can’t get input stream from URL! "
Relájense, el error es básicamente por temas de seguridad ya que la imagen está en https y el sitio del api de gatitos no permite la descarga.
El código:
image = ImageIO.read(url);
ImageIcon fondoG = new ImageIcon(image);
Si funciona en http o https que no impida la descarga de la imagen (lo probé), una simple declaración de ulr no es suficiente para descargar la imagen protegida.
Esto me funcionó:
HttpURLConnection httpcon = (HttpURLConnection)url.openConnection();
httpcon.addRequestProperty("User-Agent", "");
BufferedImage bufferedImage = ImageIO.read(httpcon.getInputStream());
ImageIcon fondoG = new ImageIcon(bufferedImage);
Creditos a un usuario de la siguiente clase.
Saludos!
Este es el codigo entero con la solucion del error Input Stream
`public static void verGatitos() throws IOException{
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://api.thecatapi.com/v1/images/search")
.method("GET", null)
.build();
Response response = client.newCall(request).execute();
Profesor, el error de Can’t get input stream from URL! logre solucionarlo gracias al código que compartieron mas abajo que va debajo de la instancia del URL y antes del ImageIcon
ahora podre seguir con el tutorial, pero, si no es mucho pedir, alguien podría explicar ese pedacito de código? o el por que algunos les funciona sin ese código y a otros no? Gracias, seguiré investigando si tengo la respuesta la compartiré.
Al ejecutar el programa me trae un IIOException: Can't get input stream from URL
javax.imageio.IIOException: Can't get input stream from URL!
at javax.imageio.ImageIO.read(ImageIO.java:1401)
at com.donnatto.gatos.CatService.verGatos(CatService.java:40)
at com.donnatto.gatos.Start.main(Start.java:28)
Caused by: java.io.IOException: Server returned HTTP response code: 403 for URL: https://cdn2.thecatapi.com/images/MTU1Nzc3MQ.jpg
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1900)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1498)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:268)
at java.net.URL.openStream(URL.java:1057)
at javax.imageio.ImageIO.read(ImageIO.java:1399)
... 2 more
```
Quien quiere ver gatos? lo de hoy son los memes, les dejo un proyecto en github que busca memes en reddit y devuelve un JSON con la información, este es el link de la API https://meme-api.herokuapp.com/gimme
Este es mi codigo:
MemeService
public class MemesService {
public static void verMemes() throws IOException {
ArrayList<String> options = new ArrayList<>();
options.add(" 1. ver otro meme");
options.add(" 2. abrir meme en chrome");
options.add(" 3. favoritos");
options.add(" 4. volver al menu");
int op = -1;
do {
Meme meme = getMemeFromAPI();
Object input = JOptionPane.showInputDialog(null, "Opciones: ", meme.getTitle()+" subreddit: "+meme.getSubreddit(), JOptionPane.INFORMATION_MESSAGE, getImageFromURL(meme.getUrl()), options.toArray(), options.get(0));
op = options.indexOf(input);
//abre el meme en el navegador chrome
if(op == 1) Runtime.getRuntime().exec(new String[]{"cmd", "/c","start chrome "+meme.getPostLink()});
}while(op != 3);
}
private static Icon getImageFromURL(String url) throws IOException, MalformedURLException {
return new ImageIcon(ImageIO.read(new URL(url)).getScaledInstance(800,800, BufferedImage.SCALE_SMOOTH));
}
private static Meme getMemeFromAPI() {
Unirest.setTimeouts(0, 0);
Meme meme = new Meme();
try {
HttpResponse<String> response = Unirest.get("https://meme-api.herokuapp.com/gimme")
.asString();
meme = new Gson().fromJson(response.getBody(), Meme.class);
} catch (UnirestException e) {
e.printStackTrace();
}
return meme;
}
}
Clase Meme
public class Meme {
private String url;
private String postLink;
private String subreddit;
private String title;
//private final String apiKey= "";
public Meme() {}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getPostLink() {
return postLink;
}
public void setPostLink(String postLink) {
this.postLink = postLink;
}
public String getSubreddit() {
return subreddit;
}
public void setSubreddit(String subreddit) {
this.subreddit = subreddit;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
En caso de que no te abra la documentación en thecatapi debes usar una vpn (en mi caso usé proton vpn), y debes configurar como máximo java 17 (yo como tenía java 21 no me cargaba okhttp en el pom.xml).
No esperen que todo les salga perfecto a la primera, tambien hay que leer los comentarios de los compañeros he ir probando el código por nuestra cuenta y haciendo Debug para entender y identificar los errores en la líneas especificas. antes de implementar el menú hice pruebas, y con el apoyo de los comentarios fui corrigiendo los errores que se tenia. así me quedo la clase GatosService:
<public class GatosService {
public static void verGatos() throws IOException {
// Traemos los datos de la Api dados por postman
OkHttpClient client = new OkHttpClient();
// MediaType mediaType = MediaType.parse("text/plain");
// RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder()
.url("https://api.thecatapi.com/v1/images/search")
.get()
.build();
Response response = client.newCall(request).execute();
String elJson = response.body().string();
// devemos cortar los primeros corchetes de iteracion del archivo
elJson = elJson.substring(1, elJson.length()); // corte el primer corteche
elJson = elJson.substring(0, elJson.length()-1); // corto el ultimo corchete
// creo el objeto de la Gson
Gson gson = new Gson();
// Apartir del gson, creo el objeto gato
Gatos gatos = gson.fromJson(elJson, Gatos.class);
// Redimencinar Imagen
Image image = null;
try {
URL url = new URL(gatos.getUrl());
//Creo una conexión HTTP con el servidor que aloja la imagen del perro
HttpURLConnection http = (HttpURLConnection) url.openConnection();
// Agrega una propiedad de solicitud al objeto http
http.addRequestProperty("User-Agent", "");
BufferedImage bufferedImage = ImageIO.read(http.getInputStream());
ImageIcon fondoGato = new ImageIcon(bufferedImage);
if (fondoGato.getIconWidth() > 800 || fondoGato.getIconHeight() > 500) {
// redimencionar
Image fondo = fondoGato.getImage();
Image modificada = fondo.getScaledInstance(800, 500, java.awt.Image.SCALE_SMOOTH);
fondoGato = new ImageIcon(modificada);
}
String id_gato = gatos.getId();
String opcion = (String) JOptionPane.showInputDialog(null, null, id_gato, JOptionPane.INFORMATION_MESSAGE, fondoGato,null, null);
} catch (IOException e) {
System.out.println(e);
}
}
}>