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

[Projeto] Desafio resolvido 3

package desafio.excecao;

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;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class GitHubService {
    private static final String URL_GITHUB_USERS = "https://api.github.com/users/";
    private static Gson gson = new Gson();

    public GitHubUser buscarUser(String nomeUsuario) throws IOException, InterruptedException {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest
                .newBuilder()
                .uri(URI.create(URL_GITHUB_USERS + nomeUsuario))
                .build();

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

        if(response.statusCode() == 404) {
            throw new UsuarioNaoEncontradoException("o usuário: " + nomeUsuario + " não foi encontrado na base do Github, verifique e tente novamente.");
        }

        return new Gson().fromJson(usuarioJson, GitHubUser.class);
    }

    public GitHubUserRepo buscarUserComRepo(String nomeUsuario) throws IOException, InterruptedException {
        GitHubUser user = this.buscarUser(nomeUsuario);

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

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

        if(response.statusCode() == 404) {
            throw new UsuarioNaoEncontradoException("o usuário: " + nomeUsuario + " não foi encontrado na base do Github, verifique e tente novamente.");
        }

        GitHubRepo[] repo = gson.fromJson(response.body(), GitHubRepo[].class);

        return new GitHubUserRepo(user, Arrays.asList(repo));

    }

}
package desafio.excecao;

public record GitHubUser(String login, String name, String location, String repos_url) {

    @Override
    public String toString() {
        return "GitHubUser{" +
                "login='" + login + '\'' +
                ", name='" + name + '\'' +
                ", location='" + location + '\'' +
                '}';
    }
}
package desafio.excecao;

import java.util.List;

public record GitHubRepo(String name, String html_url) {
}
package desafio.excecao;

import java.util.List;

public record GitHubUserRepo(GitHubUser gitHubUser, List<GitHubRepo> repos) {
}
package desafio.excecao;

import com.google.gson.Gson;

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

public class PrincipalGitHub {
    public static void main(String[] args) throws IOException, InterruptedException {
        GitHubService gitHubService = new GitHubService();
        Scanner sc = new Scanner(System.in);
        String menu = """
                
                Olá, seja bem vindo.
                Escolha uma das opções abaixo para consulta das informações no GitHub
                
                1- Buscar somente usuário
                2- Buscar usuários e repositorios
                0- Sair
                """;

        int opcao = 1;
        while (opcao != 0) {
            System.out.println(menu);
            opcao = Integer.parseInt(sc.nextLine());
            switch (opcao) {
                case 0:
                    System.out.println("Saindo...");
                    break;
                case 1:
                    System.out.println("Por favor, informe o nome de usuário:");
                    String nome = sc.nextLine();

                    try {
                        System.out.println(gitHubService.buscarUser(nome));
                        break;
                    } catch (UsuarioNaoEncontradoException e){
                        System.out.println(e.getMessage());
                        break;
                    }
                case 2:
                    System.out.println("Por favor, informe o nome de usuário:");
                    String usuario = sc.nextLine();

                    try {
                        System.out.println(gitHubService.buscarUserComRepo(usuario));
                        break;
                    } catch (UsuarioNaoEncontradoException e){
                        System.out.println(e.getMessage());
                        break;
                    }

                default:
                    System.out.println("Opção invalida!");
            }
        }
    }
}
3 respostas

Oi, Aldeny! Como vai?

Agradeço por compartilhar.

Eu curti a separação de responsabilidades no GitHubService e o uso de record (GitHubUser, GitHubRepo, GitHubUserRepo) pra modelar os dados, além do tratamento da UsuarioNaoEncontradoException com statusCode() == 404, deixando o fluxo do switch bem claro.

Você pode validar a opção do menu com try/catch pra evitar NumberFormatException quando a entrada não for um número.


try {
  int opcao = Integer.parseInt(sc.nextLine());
  System.out.println("Opcao escolhida: " + opcao);
} catch (NumberFormatException e) {
  System.out.println("Digite apenas numeros no menu.");
}
Conteúdos relacionados
Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Oiee Lorena, por aqui tudo tranquilo.
Obrigado pela dica, aproveiei e corrigir finalizado o Scanner na saida do While.

solução!

Compartilhando o codigo para que outras pessoas possam se basear.

package desafio.excecao;

import com.google.gson.Gson;

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

public class PrincipalGitHub {
    public static void main(String[] args) throws IOException, InterruptedException {
        Scanner sc = new Scanner(System.in);
        GitHubService gitHubService = new GitHubService();
        String menu = """
                
                Olá, seja bem vindo.
                Escolha uma das opções abaixo para consulta das informações no GitHub
                
                1- Buscar somente usuário
                2- Buscar usuários e repositorios
                0- Sair
                """;

        int opcao = 1;
        while (opcao != 0) {
            System.out.println(menu);
            try {
                opcao = Integer.parseInt(sc.nextLine());

                switch (opcao) {
                    case 0:
                        System.out.println("Saindo...");
                        break;
                    case 1:
                        System.out.println("Por favor, informe o nome de usuário:");
                        String nome = sc.nextLine();

                        try {
                            System.out.println(gitHubService.buscarUser(nome));
                            break;
                        } catch (UsuarioNaoEncontradoException e){
                            System.out.println(e.getMessage());
                            break;
                        }
                    case 2:
                        System.out.println("Por favor, informe o nome de usuário:");
                        String usuario = sc.nextLine();

                        try {
                            System.out.println(gitHubService.buscarUserComRepo(usuario));
                            break;
                        } catch (UsuarioNaoEncontradoException e){
                            System.out.println(e.getMessage());
                            break;
                        }

                    default:
                        System.out.println("Opção invalida!");
                }
            } catch (NumberFormatException e) {
                System.out.println("Opção invalida, Digite apenas numeros no menu.");
            }
        }
        sc.close();
    }
}