Bom dia, pessoal!! Vou compartilhar aqui com vocês minha refatoração no código da aula (organização em classes - OO).
Para tanto, criei duas novas classes (Http e GeraJson).
A Http é uma classe que faz as buscas do filme e já monta o TituloOmdb:
package br.com.alura.screenmatch.apis;
import br.com.alura.screenmatch.excecoes.ErroDeConversaoDeAnoException;
import br.com.alura.screenmatch.modelos.TituloOmdb;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
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 Http {
private String endereco = "https://www.omdbapi.com/?t=";
private TituloOmdb meuTituloOmdb;
public Http (String filme) throws IOException, InterruptedException {
this.endereco = endereco + filme.replace(" ","+") + "&apikey=90256809";
HttpClient client = HttpClient.newHttpClient();
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
.setPrettyPrinting()
.create();
try {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(endereco))
.build();
HttpResponse<String> response = client
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Dados do filme: " + response.body());
meuTituloOmdb = gson.fromJson(response.body(),TituloOmdb.class);
System.out.println("Título Omdb: ");
System.out.println(meuTituloOmdb);
} catch (NumberFormatException e) {
System.out.println("Aconteceu um erro: ");
System.out.println(e.getMessage());
} catch (IllegalArgumentException e) {
System.out.println("Aconteceu um erro de argumento na busca, verifique o endereço!");
}
}
public TituloOmdb getMeuTituloOmdb() {
return meuTituloOmdb;
}
}
A classe GeraJson é responsável por gerar o arquivo final Json com os filmes que pesquisamos:
package br.com.alura.screenmatch.apis;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
public class GeraJson {
public GeraJson (List lista) throws IOException {
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
.setPrettyPrinting()
.create();
FileWriter escrita = new FileWriter("filmes.json");
escrita.write(gson.toJson(lista));
escrita.close();
}
}
Por fim, a classe "PrincipalComBuscasOO" fica reestruturada da seguinte forma:
package br.com.alura.screenmatch.principal;
import br.com.alura.screenmatch.apis.GeraJson;
import br.com.alura.screenmatch.apis.Http;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import br.com.alura.screenmatch.excecoes.ErroDeConversaoDeAnoException;
import br.com.alura.screenmatch.modelos.Titulo;
public class PrincipalComBuscasOO {
public static void main(String[] args) throws IOException, InterruptedException {
Scanner sc = new Scanner(System.in);
String busca = "";
List<Titulo> titulos = new ArrayList<>();
while (!busca.equalsIgnoreCase("sair")) { //usei o equals porque é assim que compara string e não com == e usei o IgnoreCase para ignorar letras maiúsculas
// e usei o ! porque não quero que seja igual.
System.out.print("Digite um filme para busca: ");
busca = sc.nextLine();
if (busca.equalsIgnoreCase("sair")) {
break; // uso o break para sair do loop while
}
Http http = new Http(busca);
try{
Titulo meuTitulo = new Titulo(http.getMeuTituloOmdb());
System.out.println("Título já convertido: ");
System.out.println(meuTitulo);
titulos.add(meuTitulo);
} catch (ErroDeConversaoDeAnoException e) {
System.out.println(e.getMessage());
}
}
GeraJson geraJson = new GeraJson(titulos);
System.out.println("O programa finalizou!");
sc.close();
}
}