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

Haga lo que hici

package com.aluracursos.screenmatch;

import com.aluracursos.screenmatch.principal.Principal;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class ScreenmatchApplication implements CommandLineRunner {

    public static void main(String[] args) {

        SpringApplication.run(ScreenmatchApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        Principal menu = new Principal();
        menu.muestraMenu();
    }
}
package com.aluracursos.screenmatch.principal;

import com.aluracursos.screenmatch.ConsumoAPI;
import com.aluracursos.screenmatch.model.DatosSeries;
import com.aluracursos.screenmatch.model.DatosTempo;
import com.aluracursos.screenmatch.service.ConvierteDatos;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Principal {
    private Scanner teclado = new Scanner(System.in);
    private ConsumoAPI buscApi = new ConsumoAPI();
    private final String urlFija = "https://www.omdbapi.com/?t=";
    private  final  String apiKey = "&apikey=4fc7c187";
    private ConvierteDatos convierte = new ConvierteDatos();


    public  void  muestraMenu(){
        System.out.println("Ingresa el nombre de la serie que estas buscando: ");
        var nombeSerie = teclado.nextLine();
        var json = buscApi.obtenerDatps(urlFija + nombeSerie.replace(" ", "+") + apiKey);
        System.out.println(json);
        var datos = convierte.obtenerDatos(json, DatosSeries.class);
        System.out.println(datos);

        List<DatosTempo> tempo = new ArrayList<>();
        for (int i = 1; i <= datos.totalTemps(); i++){
            json = buscApi.obtenerDatps(urlFija + nombeSerie.replace(" ", "+") + "&Season="+ i + apiKey);
            var datosTemporadas = convierte.obtenerDatos(json, DatosTempo.class);
            tempo.add(datosTemporadas);
        }

        //tempo.forEach(System.out::println);

        //estp trae solo el titulo de los episodios de la temporada
//        for (int i = 0; i < datos.totalTemps(); i++) {
//            List<DatosEpisodio> episodiosTempo = tempo.get(i).episodios();
//            for (int j = 0; j < episodiosTempo.size(); j++) {
//                System.out.println(episodiosTempo.get(j).titulo());
//            }
//        }
        tempo.forEach(t -> t.episodios().forEach(e -> System.out.println(e.titulo())));

    }
}
package com.aluracursos.screenmatch.model;

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import java.util.List;

@JsonIgnoreProperties (ignoreUnknown = true)
public record DatosTempo(
        @JsonAlias("Season") Integer numero,
        @JsonAlias("Episodes") List <DatosEpisodio> episodios
) {
}
package com.aluracursos.screenmatch;

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

public class ConsumoAPI {
    public  String obtenerDatps (String url){
        HttpClient cliente = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).build();
        HttpResponse<String> response = null;

        try{
            response = cliente.send(request, HttpResponse.BodyHandlers.ofString());
        } catch (IOException e){
            throw new RuntimeException(e);
        }catch (InterruptedException e){
            throw new RuntimeException(e);
        }
        String json = response.body();
        return json;
    }
}
1 respuesta

Hola Jose, espero que estés bien

Parece que estás trabajando en un proyecto que interactúa con una API para obtener información sobre series y sus temporadas. Tu código parece estar bastante bien estructurado, pero he notado algunos detalles que podrías revisar para asegurarte de que todo funcione correctamente.

  1. Corrección de Errores Tipográficos: En tu clase ConsumoAPI, el método obtenerDatps parece tener un error tipográfico en su nombre. Debería ser obtenerDatos para mantener la coherencia con el resto del código.

  2. Manejo de Excepciones: Actualmente, estás lanzando un RuntimeException en caso de errores de IO o interrupciones. Podría ser útil manejar estas excepciones de manera más específica, quizás mostrando un mensaje amigable al usuario o registrando el error para depuración.

  3. Interacción con el Usuario: En tu método muestraMenu, asegúrate de que el usuario ingrese correctamente el nombre de la serie. Podrías agregar validaciones para manejar entradas vacías o incorrectas.

  4. Uso de Streams: Veo que estás utilizando lambdas y streams para imprimir los títulos de los episodios. Esto es excelente para mantener el código limpio y conciso.

  5. Pruebas: Asegúrate de probar tu aplicación con diferentes nombres de series para verificar que maneje correctamente los datos devueltos por la API.

Aquí tienes un ejemplo de cómo podrías mejorar el manejo de excepciones en el método obtenerDatos:

public String obtenerDatos(String url) {
    HttpClient cliente = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).build();
    try {
        HttpResponse<String> response = cliente.send(request, HttpResponse.BodyHandlers.ofString());
        return response.body();
    } catch (IOException | InterruptedException e) {
        System.err.println("Error al obtener datos de la API: " + e.getMessage());
        return "{}"; // Retorna un JSON vacío en caso de error
    }
}

Espero que estas sugerencias te sean de ayuda para avanzar en tu proyecto. ¡Bons estudios!