Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Exercício - Consumindo a API do GitHub

Bom dia pessoal,

preciso de uma ajuda com meu código referente ao exercício:

"Desenvolva um programa em Java que permite aos usuários consultar informações sobre um usuário do GitHub (utilize a API pública do GitHub para obter os dados). Crie uma classe de exceção personalizada, ErroConsultaGitHubException, que estende RuntimeException. Lance essa exceção quando o nome de usuário não for encontrado. No bloco catch, trate de forma específica essa exceção, exibindo uma mensagem amigável."

Problema: Quando eu realizo a consulta, é retornado um valor null, sendo assim, a consulta nunca é finalizada de forma correta, abaixo vou colocar o código:


package br.com.duarte.exer03atv03.main;

import br.com.duarte.exer03atv03.apigithub.ApiGithubConsulta;

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

public class Main {
    public static void main(String[] args) throws IOException, InterruptedException {
        Scanner scanner = new Scanner(System.in);
        ApiGithubConsulta consulta = new ApiGithubConsulta();

        System.out.print("Digite o nome do usuário do GitHub: ");
        consulta.setGitHubUser(scanner.next());

        System.out.println(consulta.toString());
    }
}

package br.com.duarte.exer03atv03.model;

public class UserGitHub {
    private String name;
    private String login;
    private String id;
    private String htmlUrl;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getHtmlUrl() {
        return htmlUrl;
    }

    public void setHtmlUrl(String htmlUrl) {
        this.htmlUrl = htmlUrl;
    }
}


package br.com.duarte.exer03atv03.apigithub;

import br.com.duarte.exer03atv03.model.UserGitHub;
import com.google.gson.Gson;

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 ApiGithubConsulta {
    private String gitHubUser;

    public String getGitHubUser() {
        return gitHubUser;
    }

    public void setGitHubUser(String gitHubUser) {
        this.gitHubUser = gitHubUser;
    }

    private String endereco = "https://api.github.com/users/" + getGitHubUser();

    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(endereco))
            .build();

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

    String jsonBody = response.body();

    Gson gson = new Gson();
    UserGitHub searchUser = gson.fromJson(jsonBody, UserGitHub.class);

    public ApiGithubConsulta() throws IOException, InterruptedException {

    }

    @Override
    public String toString() {
        return """
               
               Json: %s
               
               Endereço: %s
               
               Valor Digitado: %s
               
               -----------------------------------------------------------------------------------
               
               Nome: %s
               Login: %s
               Id: %s
               URL: %s
            
                
               """.formatted(jsonBody, endereco, getGitHubUser(), searchUser.getName(), searchUser.getLogin(), searchUser.getId(), searchUser.getHtmlUrl());
    }
}

O resultado no console:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Após análise do código, alguém tem alguma dica do que pode ser o problema?

2 respostas
solução!

Olá Rodrigo.

Tudo bem?

O problema parece estar relacionado ao momento em que a URL da API do GitHub é construída. No seu código, a URL é definida no momento da criação da instância da classe ApiGithubConsulta, antes de você definir o valor do usuário do GitHub. Isso faz com que a URL seja construída com um valor null.

Para tentar corrigir isso, você pode mover a lógica de construção da URL e a consulta à API para um método separado, que será chamado após definir o usuário do GitHub. Além disso, você deve tratar a exceção personalizada ErroConsultaGitHubException conforme solicitado no exercício.

Aqui está uma versão corrigida do seu código:

package br.com.duarte.exer03atv03.main;

import br.com.duarte.exer03atv03.apigithub.ApiGithubConsulta;
import br.com.duarte.exer03atv03.apigithub.ErroConsultaGitHubException;

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

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        ApiGithubConsulta consulta = new ApiGithubConsulta();

        System.out.print("Digite o nome do usuário do GitHub: ");
        consulta.setGitHubUser(scanner.next());

        try {
            consulta.consultar();
            System.out.println(consulta.toString());
        } catch (ErroConsultaGitHubException e) {
            System.out.println("Usuário do GitHub não encontrado: " + e.getMessage());
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}
package br.com.duarte.exer03atv03.apigithub;

public class ErroConsultaGitHubException extends RuntimeException {
    public ErroConsultaGitHubException(String message) {
        super(message);
    }
}
package br.com.duarte.exer03atv03.apigithub;

import br.com.duarte.exer03atv03.model.UserGitHub;
import com.google.gson.Gson;

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 ApiGithubConsulta {
    private String gitHubUser;
    private String jsonBody;
    private UserGitHub searchUser;

    public String getGitHubUser() {
        return gitHubUser;
    }

    public void setGitHubUser(String gitHubUser) {
        this.gitHubUser = gitHubUser;
    }

    public void consultar() throws IOException, InterruptedException {
        String endereco = "https://api.github.com/users/" + getGitHubUser();

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(endereco))
                .build();

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

        jsonBody = response.body();

        if (response.statusCode() == 404) {
            throw new ErroConsultaGitHubException("Usuário não encontrado: " + getGitHubUser());
        }

        Gson gson = new Gson();
        searchUser = gson.fromJson(jsonBody, UserGitHub.class);
    }

    @Override
    public String toString() {
        return """
               
               Json: %s
               
               Endereço: https://api.github.com/users/%s
               
               Valor Digitado: %s
               
               -----------------------------------------------------------------------------------
               
               Nome: %s
               Login: %s
               Id: %s
               URL: %s
            
                
               """.formatted(jsonBody, getGitHubUser(), getGitHubUser(), searchUser.getName(), searchUser.getLogin(), searchUser.getId(), searchUser.getHtmlUrl());
    }
}

Com essas alterações, o método consultar será chamado após definir o usuário do GitHub, garantindo que a URL seja construída corretamente. Além disso, a exceção personalizada ErroConsultaGitHubException será lançada e tratada adequadamente.

Veja se faz sentido, e faça as alterações.

Espero ter ajudado. Qualquer dúvida manda aqui. Bons estudos.

Boa tarde Renan, tudo bem? Agradeço a ajuda!

De fato solucionou meu problema! Essa solução apresentada não apenas sanou o problema como tb me abriu a cabeça para entender melhor a questão de instanciar as classes e como deve-se usa-las em algumas situações!

Agradeço a ajuda! Boa semana!