1
resposta

Conversor de moedas

Gostaria de ajuda ja entreguei o conversor mais quero melhora-lo tipo devolver o cambio do dia (isso eu consegui e também reprnar o cambio do dia anterior (esse eu não consegui) retorna is null. vou postar o código completo. aqui

public class appMoeda {
    private static final String API_KEY = "ef3175fc6eb8f78d6fd445d9";
    private static final String HISTORICAL_API_KEY = "HISTORY";

    public static void main(String[] args) {
        Scanner menu = new Scanner(System.in);
//menu de opções 
        while (true) {
            System.out.print("| Opção 1 - Euro (EUR) pra Dolar (USD)                           |\n");
            System.out.print("| Opção 2 - Dolar (USD) pra Euro (EUR)                           |\n");
            System.out.print("| Opção 3 - Real (BRL) pra Dolar (USD)                           |\n");
            System.out.print("| Opção 4 - Dolar (USD) pra Real (BRL)                           |\n");
            System.out.print("| Opção 0 - Sair                                                 |\n");
            System.out.print("Digite uma opção: ");
            int opcao = menu.nextInt();

            if (opcao == 0) {
                System.out.print("\nConversor Finalizado!");
                menu.close();
                break;
            }

            System.out.print("Digite o valor a ser convertido: ");
            double valor = menu.nextDouble();
            // ler opççao
            switch (opcao) {
                case 1:
                    System.out.printf("\n%.2f EUR = %.2f USD\n", valor, converterMoeda("EUR", "USD", valor) + valor, converterMoedaDiaAnterior("EUR", "USD", valor));
                    break;
                case 2:
                    System.out.printf("\n%.2f USD = %.2f EUR\n", valor, converterMoeda("USD", "EUR", valor) + valor, converterMoedaDiaAnterior("USD", "EUR", valor));;
                    break;
                case 3:
                    System.out.printf("\n%.2f BRL = %.2f USD\n", valor, converterMoeda("BRL", "USD", valor) + valor, converterMoedaDiaAnterior("BRL", "USD", valor));
                    break;
                case 4:
                    System.out.printf("\n%.2f USD = %.2f BRL\n", valor, converterMoeda("USD", "BRL", valor) + valor, converterMoedaDiaAnterior("USD", "BRL", valor));;
                    break;
                
                default:
                    System.out.print("\nOpção Inválida! tente novamente com uma opção valida!\n");
                    break;
            }
        }
    }
    private static double converterMoeda(String from, String to, double valor) {
        // Requisição de Serviço
        try {
            String url_str = "https://v6.exchangerate-api.com/v6/" + API_KEY + "/latest/" + from;
            URL url = new URL(url_str);
            HttpURLConnection request = (HttpURLConnection) url.openConnection();
            request.connect();

            JsonParser jp = new JsonParser();
            JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent()));
            JsonObject jsonobj = root.getAsJsonObject();

            double taxaDeCambio = jsonobj.getAsJsonObject("conversion_rates").get(to).getAsDouble();
            //Retorna taxa de cambio
            System.out.println(String.format("Taxa de câmbio atual de %s para %s é: %.2f", from, to, taxaDeCambio));


            //Retorna valor convertido
            return valor * taxaDeCambio;
            
        } catch (Exception e) {
            System.out.println("Erro ao obter taxa de câmbio: " + e.getMessage());
            return 0;
        }
    }

        private static double converterMoedaDiaAnterior (String from, String to,double valor){
            try {
                LocalDate yesterday = LocalDate.now().minusDays(1);
                String date = yesterday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                String url_str = "https://api.currencylayer.com/historical?access_key=" + HISTORICAL_API_KEY + "&date=" + date + "&currencies=" + to + "&source=" + from;
                URL url = new URL(url_str);
                HttpURLConnection request = (HttpURLConnection) url.openConnection();
                request.connect();

                JsonParser jp = new JsonParser();
                JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent()));
                JsonObject jsonobj = root.getAsJsonObject();

                double taxaDeCambio = jsonobj.getAsJsonObject("quotes").get(from + to).getAsDouble();
                System.out.println(String.format("Taxa de câmbio do dia anterior de %s para %s é: %.2f", from, to, taxaDeCambio));
                return valor * taxaDeCambio;
            } catch (Exception e) {
                System.out.println("Erro ao obter taxa de câmbio: " + e.getMessage());
                return 0;
            }
        }
   }
1 resposta

Oi, Paulo! Tudo bem?

Parabéns pela iniciativa de tentar melhorar o conversor de moedas! Deixo como recomendação, inicialmente, verificar se a chave de API HISTORICAL_API_KEY está correta e ativa para a API que estamos utilizando para obter as taxas históricas, além da URL da API.

Somado a isso, devemos verificar se a estrutura do JSON retornado pela API está correta e se estamos acessando os campos corretamente, o que podemos fazer através de alguns logs para entender melhor o que está sendo retornado.

Fazendo algumas alterações no método converterMoedaDiaAnterior para incluir logs e verificar a resposta da API, da seguinte forma:

private static double converterMoedaDiaAnterior(String from, String to, double valor) {
    try {
        LocalDate yesterday = LocalDate.now().minusDays(1);
        String date = yesterday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        String url_str = "https://api.currencylayer.com/historical?access_key=" + HISTORICAL_API_KEY + "&date=" + date + "&currencies=" + to + "&source=" + from;
        URL url = new URL(url_str);
        HttpURLConnection request = (HttpURLConnection) url.openConnection();
        request.connect();

        JsonParser jp = new JsonParser();
        JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent()));
        JsonObject jsonobj = root.getAsJsonObject();

        // Adicionando log para verificar a resposta da API
        System.out.println("Resposta da API: " + jsonobj.toString());

        double taxaDeCambio = jsonobj.getAsJsonObject("quotes").get(from + to).getAsDouble();
        System.out.println(String.format("Taxa de câmbio do dia anterior de %s para %s é: %.2f", from, to, taxaDeCambio));
        return valor * taxaDeCambio;
    } catch (Exception e) {
        System.out.println("Erro ao obter taxa de câmbio: " + e.getMessage());
        return 0;
    }
}

Devemos executar o código e verificar a saída no console, o que deve nos informar se a resposta da API está correta ou se há algum problema na estrutura do JSON. Porém, se a resposta da API estiver correta, mas o problema persistir, verifique se o campo "quotes" está sendo acessado corretamente, pois a chave para o campo pode ser diferente do que você espera (por exemplo, pode ser "USD" + "BRL" em vez de "USDBRL").

Caso o problema persista após essas sugestões peço que envie o projeto completo, de preferencia o repositório no GitHub do projeto para que eu possa testá-lo e assim conseguir encontrar o problema de forma mais assertiva.

Espero ter ajudado!

Um forte abraço e bons estudos!