Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

Desafío: construyendo una nueva aplicación

Pelicula.java (record)

package com.starwarsapi.modelos;

public record Pelicula(
        String title,
        int episode_id,
        String opening_crawl,
        String director,
        String producer,
        String release_date
) {}

ConsultaPelicula.java

package com.starwarsapi.servicios;

import com.google.gson.Gson;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.GsonBuilder;
import com.starwarsapi.modelos.Pelicula;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ConsultaPelicula {

    public Pelicula buscaPelicula(int numeroDePelicula) {

        String direccion = "https://swapi.py4e.com/api/films/" 
                + numeroDePelicula + "/";

        try {
            HttpClient client = HttpClient.newHttpClient();

            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(direccion))
                    .build();

            HttpResponse<String> response =
                    client.send(request, HttpResponse.BodyHandlers.ofString());

            String json = response.body();

            Gson gson = new GsonBuilder()
                    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
                    .setPrettyPrinting()
                    .create();

            return gson.fromJson(json, Pelicula.class);

        } catch (Exception e) {
            throw new RuntimeException("No encontré esa película");
        }
    }
}

GeneradorDeArchivo.java

package com.starwarsapi.utilidades;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.starwarsapi.modelos.Pelicula;

import java.io.FileWriter;
import java.io.IOException;

public class GeneradorDeArchivo {

    public void guardarJson(Pelicula pelicula) throws IOException {

        Gson gson = new GsonBuilder()
                .setPrettyPrinting()
                .create();

        FileWriter escritura = new FileWriter(pelicula.title() + ".json");

        escritura.write(gson.toJson(pelicula));
        escritura.close();
    }
}

Principal.java

package com.starwarsapi.principal;

import com.starwarsapi.modelos.Pelicula;
import com.starwarsapi.servicios.ConsultaPelicula;
import com.starwarsapi.utilidades.GeneradorDeArchivo;

import java.io.IOException;
import java.util.Scanner;

public class Principal {

    public static void main(String[] args) {

        Scanner lectura = new Scanner(System.in);
        ConsultaPelicula consulta = new ConsultaPelicula();
        GeneradorDeArchivo generador = new GeneradorDeArchivo();

        System.out.println("Escriba el número de la película (1-6):");

        try {
            var numeroDePelicula = Integer.valueOf(lectura.nextLine());

            Pelicula pelicula = consulta.buscaPelicula(numeroDePelicula);

            System.out.println(pelicula);

            generador.guardarJson(pelicula);

            System.out.println("Archivo generado con éxito.");
            System.out.println("Finalizando la aplicación.");

        } catch (NumberFormatException e) {
            System.out.println("Debe ingresar un número válido.");
        } catch (RuntimeException | IOException e) {
            System.out.println(e.getMessage());
            System.out.println("Finalizando la aplicación.");
        }
    }
}
1 respuesta

¡Hola Estudiante, espero que estés bien!

Espero que estés disfrutando del desafío. Parece que ya has avanzado bastante en tu aplicación que consume la API de Star Wars y genera archivos JSON con la información de las películas.

Por lo que veo, tu código está bien estructurado y sigue los conceptos que has aprendido en el curso. Estás utilizando HttpClient para hacer solicitudes a la API, Gson para manejar JSON, y has implementado correctamente el manejo de excepciones para situaciones comunes como errores de formato de número y problemas al consultar la API.

Una pequeña mejora que podrías considerar es manejar de manera más específica los errores que pueden ocurrir al consumir la API. Por ejemplo, podrías verificar el código de respuesta HTTP antes de intentar deserializar el JSON, para asegurarte de que la solicitud fue exitosa (código 200). Esto te permitiría dar un mensaje de error más claro si, por ejemplo, el número de película no existe.

Aquí tienes un ejemplo de cómo podrías hacerlo:

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

if (response.statusCode() == 200) {
    String json = response.body();
    return gson.fromJson(json, Pelicula.class);
} else {
    throw new RuntimeException("Error al consultar la API: " + response.statusCode());
}

Con este cambio, tu aplicación podrá informar al usuario si hubo un problema específico con la solicitud HTTP, como un "404 Not Found" si el número de película no existe.

Espero que esta sugerencia te sea útil y te ayude a mejorar aún más tu aplicación. ¡Bons estudios!