1
resposta

[Projeto] Faça como eu fiz: utilizando a biblioteca Gson

public class PrincipalComBusca {
    public static void main(String[] args) throws IOException, InterruptedException {
        Scanner leitura = new Scanner(System.in);
        System.out.println("Digite um filme para busca: ");
        var busca = leitura.nextLine();

        String endereco = "https://www.omdbapi.com/?t=" + busca + "&apikey=chave";

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(endereco))
                .build();
        HttpResponse<String> response = client
                .send(request, HttpResponse.BodyHandlers.ofString());
        String json = response.body();
        System.out.println(json);

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .create();
        // Titulo meuTitulo = gson.fromJson(json, Titulo.class);
        TituloOmdb meuTituloOmbdb = gson.fromJson(json, TituloOmdb.class);
        System.out.println(meuTituloOmbdb);

        Titulo meuTitulo = new Titulo(meuTituloOmbdb);
        System.out.println("Título já convertido");
        System.out.println(meuTitulo);

    }
}

https://github.com/plasta4/2944-java-screenmatch-consumindo-webservice

1 resposta

Olá, Pedro Henrique. Como vai?

Parabéns pelo excelente projeto! O seu código está muito bem estruturado e demonstra que você compreendeu perfeitamente a arquitetura moderna de consumo de APIs em Java.

O fluxo que você montou é o padrão de mercado: criar o cliente HTTP (HttpClient), disparar a requisição (HttpRequest), capturar a resposta em formato JSON (HttpResponse) e utilizar a biblioteca Gson para desserializar esse JSON.

O grande destaque do seu código vai para o uso do TituloOmdb (provavelmente um Record) para fazer o mapeamento direto do JSON e, em seguida, transferir esses dados para a sua classe de domínio Titulo. Essa separação entre um objeto de transferência de dados (DTO) e as regras do seu sistema é uma das melhores práticas mais valiosas na engenharia de software!

Para enriquecer o seu projeto e apoiar a sua evolução nos próximos capítulos — que abordam justamente o tratamento de erros —, separei duas dicas fundamentais para você blindar o seu código:


1. Lidando com Espaços na Busca da API

Repare nesta linha do seu código:

String endereco = "https://www.omdbapi.com/?t=" + busca + "&apikey=chave";

Se o usuário digitar um filme com nome composto, como por exemplo "The Matrix", a variável endereco vai virar .../?t=The Matrix.... O problema é que espaços em branco não são caracteres válidos em URLs e podem fazer a requisição falhar ou retornar um erro dependendo de como o cliente HTTP interpreta o texto.

Para deixar seu programa 100% robusto contra nomes de filmes compostos, a boa prática em Java é codificar o texto digitado usando a classe URLEncoder. Isso substitui os espaços por %20 ou + automaticamente:

// Importe java.net.URLEncoder e java.nio.charset.StandardCharsets
String buscaCodificada = URLEncoder.encode(busca, StandardCharsets.UTF_8);
String endereco = "https://www.omdbapi.com/?t=" + buscaCodificada + "&apikey=chave";

2. Preparando o Terreno para o Tratamento de Erros

No momento, o seu método main está usando a cláusula throws IOException, InterruptedException. Isso significa que se a API do OMDB estiver fora do ar, se a internet cair ou se o usuário digitar uma chave de API inválida, o seu programa vai estourar um erro na tela e fechar abruptamente (crash).

Como o próximo passo do seu curso é lidar com erros, o ideal no futuro será remover esses throws da assinatura do método e envelopar o bloco de requisição e conversão do Gson em uma estrutura try-catch.

Veja um vislumbre de como o seu código vai ganhar um comportamento muito mais profissional em breve:

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

    TituloOmdb meuTituloOmbdb = gson.fromJson(json, TituloOmdb.class);
    Titulo meuTitulo = new Titulo(meuTituloOmbdb);
    System.out.println(meuTitulo);
} catch (IOException | InterruptedException e) {
    System.out.println("Erro de conexão ao tentar buscar o filme: " + e.getMessage());
} catch (JsonSyntaxException e) {
    System.out.println("Erro ao converter o JSON recebido. Verifique os dados.");
}

O repositório no seu GitHub está super organizado e o código limpo. Parabéns pela consistência e dedicação nos estudos do ecossistema Java!

Espero que possa ter lhe ajudado!