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

consumo una API y manejo de listas excepciones: API - Star Wars

Consumo de API y guardado en .JSON

package com.diego.screenmatch.api;

import com.diego.screenmatch.modelos.Titulo;
import com.diego.screenmatch.modelos.TituloSw;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonSyntaxException;

import java.io.FileWriter;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.List;

public class SWAPI {
    private final HttpClient client = HttpClient.newHttpClient();
    public Titulo obtenerDatos(String busqueda) throws IOException, InterruptedException {
        String url = "https://swapi.py4e.com/api/films/" + busqueda + "/";

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

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

        if (response.statusCode() != 200) {
            throw new RuntimeException("Error API: " + response.statusCode());
        }
        return parsearJsonSw(response.body());
    }

    private Titulo parsearJsonSw(String json) {
        Gson gson = new GsonBuilder()
                .setPrettyPrinting()
                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
                .create();
        try {
            TituloSw tituloSw = gson.fromJson(json, TituloSw.class);
            return new Titulo(tituloSw);

        } catch (JsonSyntaxException e) {
            throw new RuntimeException("Error en la sintaxis JSON: " + e.getMessage(), e);
        }
    }
    public void GuardarJson(List<Titulo> titulos) throws IOException {
        Gson gson = new GsonBuilder()
                .setPrettyPrinting()
                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
                .create();
        FileWriter escritura = new FileWriter("titulos.json");
        escritura.write(gson.toJson(titulos));
        escritura.close();
    }
}

Main y menú

package com.diego.screenmatch.principal;
import com.diego.screenmatch.api.SWAPI;
import com.diego.screenmatch.modelos.Titulo;
import com.diego.screenmatch.ui.Menu;


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class PrincipalSWAPI {
    public static void main(String[] args) throws IOException {
        Menu menu = new Menu();
        SWAPI api = new SWAPI();
        Titulo tituloSw;
        List<Titulo> titulos = new ArrayList<>();
        while (true) {
            System.out.println("\n1. A New Hope");
            System.out.println("2. The Empire Strikes Back");
            System.out.println("3. Return of the Jedi");
            System.out.println("4. The Phantom Menace");
            System.out.println("5. Attack of the Clones");
            System.out.println("6. Revenge of the Sith");
            System.out.println("7. The Force Awakens");

            String busqueda = menu.solicitarBusqueda();
            if (busqueda == null) {
                System.out.println("\nSaliendo del programa...");
                break;
            }
            try{
                tituloSw = api.obtenerDatos(busqueda);
                System.out.println("\n" + tituloSw);
                titulos.add(tituloSw);

            }catch (Exception e) {
                System.out.println("Error: " + e.getMessage());
            }
        }
        api.GuardarJson(titulos);
        System.out.println(titulos);
    }
}

modelo

package com.diego.screenmatch.modelos;

public record TituloSw(String title, String release_date, String producer) {
    @Override
    public String toString()  {
        return "(nombre=" + title +
                ", producer= " + producer +
                ", fechaDeLanzamiento=" + release_date + ")";
    }
}

Titulo

public class Titulo implements Comparable<Titulo>{

    private String nombre;
    private String producer;
    private String release_date;   

    public Titulo(TituloSw tituloSw) {
        this.nombre = tituloSw.title();
        this.producer = tituloSw.producer();
        this.release_date = tituloSw.release_date();
    }
    
    @Override
    public String toString()  {
        return "(nombre=" + nombre +
                ", fechaDeLanzamiento=" + fechaDeLanzamiento +
                ", duracionEnMinutos=" + duracionEnMinutos + ")";
    }
1 respuesta

Hola Diego, espero que estés bien

¡Gracias por compartir tu código! Parece que estás trabajando en un proyecto interesante para consumir una API de Star Wars y guardar los datos en un archivo JSON.

He revisado tu código y parece que tienes una buena estructura. Sin embargo, hay algunos puntos que podrías considerar para mejorar el manejo de excepciones y la escritura de archivos:

  1. Manejo de Excepciones: Estás lanzando una RuntimeException cuando ocurre un error al consumir la API o al parsear el JSON. Podrías considerar manejar estas excepciones de manera más específica para que el programa pueda continuar ejecutándose o al menos proporcionar mensajes de error más detallados. Por ejemplo, podrías capturar IOException y InterruptedException por separado y proporcionar mensajes de error específicos para cada caso.

  2. Cerrar Recursos: En el método GuardarJson, sería recomendable usar un bloque try-with-resources para manejar el FileWriter. Esto asegura que el recurso se cierre automáticamente, incluso si ocurre una excepción. Aquí tienes un ejemplo de cómo podrías hacerlo:

    public void GuardarJson(List<Titulo> titulos) throws IOException {
        Gson gson = new GsonBuilder()
                .setPrettyPrinting()
                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
                .create();
        try (FileWriter escritura = new FileWriter("titulos.json")) {
            escritura.write(gson.toJson(titulos));
        }
    }
    
  3. Comparación de Títulos: En tu clase Titulo, implementas Comparable<Titulo>, pero no veo el método compareTo implementado. Si planeas ordenar los títulos, necesitarás implementar este método para definir cómo se deben comparar dos instancias de Titulo.

  4. Validación de Entrada: Asegúrate de que el método menu.solicitarBusqueda() maneje correctamente las entradas no válidas o inesperadas, ya que esto podría causar problemas al construir la URL para la API.

Espero que estas sugerencias te sean útiles para mejorar tu aplicación. ¡Sigue adelante con tu proyecto!

Espero haber ayudado y buenos estudios!