6
respostas

Não consigo consumir API https no projeto Java

Prezados,

estou realizando o desafio do curso de Java Spring Boot e preciso consumir a API "https://parallelum.com.br/fipe/api/v1/motos/marcas" . Só que quando disparo essa requisição utilizando do pacote nativo do java.net, HttpClient, HttpRequest e HttpResponse, ocorre a mensagem de falha de handshake que coloquei ao final desta dúvida. Tentei colocar o endereço como 'http', porém recebo de retorno um 301 (Redirecionamento) com HttpReponse.body() vazio.

Alguém pode me ajudar porque não consigo consumir a API e/ou se preciso mudar algo na requisição? Via postman funciona tanto com https como somente com http.

Outro detalhe é que já fiz o passo a passo do tópico https://cursos.alura.com.br/forum/topico-exception-pkix-path-building-failed-sun-security-provider-certpath-suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target-342740 , porém sem sucesso. A mesma mensagem abaixo ainda aparece.

java.lang.RuntimeException: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
6 respostas

Pessoal, boa tarde!

Passando somente para relatar que fiquei insatisfeito com respeito a esse curso, mais precisamente no Desafio deste. Não consigo avançar tentando fazer o projeto final sozinho em virtude do erro que mencionei nesse tópico. Até encontrei um outro tópico da alura com uma solução proposta, porém não resolveu (Aparentemente a solução desse outro tópico que mencionei deve ser a correta, pois pesquisando na internet todos os fóruns que encontrei mencionam esse passo a passo, porém pra mim não resolveu; deve faltar alguma coisinha)

Fiquei uma semana tentando resolver buscando na internet e aguardando um retorno aqui e não consegui. Para não prejudicar meu cronograma de estudos, precisarei ver como a professora fez e terminarei o curso, porém sem fazer a parte prática por mim mesmo.

Na máquina da instrutora funciona, na minha não, com o mesmo passo a passo segundo seguido. Não sei o que é.

Queiram por gentileza revisitar o endereço da API do desafio https://parallelum.com.br/fipe/api/v1/motos/marcas para verificar se não é problema lá do web services da API, para que o próximo aluno não tenha o mesmo problema que eu e consiga fazer a parte prática certinho.

No mais, gosto muito de vocês da Alura, grato.

Oi Fábio, tudo bem?

Sinto muito pelo ocorrido. Para tentar resolver esse problema peço que siga os passos abaixo:

  • No seu navegador, acesse a URL HTTPS que o Java não conseguiu acessar.
  • Clique na cadeia de certificados HTTPS (há um ícone de cadeado no Internet Explorer), clique no cadeado para visualizar o certificado.
  • Em seguida, em Conexão não segura.
  • Clique no símbolo do certificado.
  • Vá em “Detalhes” do certificado e “Copiar para arquivo”. Copie-o no formato Base64 (.cer) .
  • Instale o certificado.

O próximo passo é fazer com que o Java reconheça esse certificado e assim, não recusar a url.

Entre no prompt de comando como administrador e vá até a pasta onde ficam as informações do certificado.Normalmente segue o caminho abaixo:

```
Java\jdk[versaodoseujdk]\jre\lib\security\
 ```

Dentro deste diretório execute o seguinte comando para importar o certificado:

 ```
 keytool import -file[caminho do diretório onde esta localizado arquivo do seu certificado.cer]  -alias [apelido para o seu certificado] -keystore  cacerts
 ```

Ele irá pedir uma senha. A senha padrão é changeit.

Feito isso, as informações do certificado serão adicionadas ao arquivo cacert. Em seguida, tente rodar novamente o programa.

Fábio, caso o problema persista, você poderá detalhar cada passo feito compartilhando o print das etapas em questão. Assim, poderei te ajudar mais assertivamente

Espero ter ajudado e fico à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá Monalisa, bom dia, tudo bem ? Obrigado pelo retorno! Se você ainda puder alterar, adiciona somente um tracinho no comando import da orientação anterior. Só consegui executar o comando de import do certificado quando fiz isso, ficando conforme abaixo:

keytool -import -file C:\Users\fabio.mendonca\Downloads\parallelum.com.br.crt -alias orientacao_forum_alura -keystore cacerts

Sobre meu problema na quebra do java ao consumir o endereço 'https://parallelum.com.br/fipe/api/v1/motos/marcas', continua acontecendo. Fiz o passo a passo orientado mas continou quebrando conforme abaixo. Será que é preciso fazer algo para refletir as mudanças ?

java.lang.RuntimeException: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at br.com.fipesearch.service.ConnectionFIPEAPI.getDataByUrl(ConnectionFIPEAPI.java:24) ~[classes/:na]
    at br.com.fipesearch.model.Fipe.consultVehicleBrand(Fipe.java:16) ~[classes/:na]
    at br.com.fipesearch.principal.AppMenus.mainMenu(AppMenus.java:46) ~[classes/:na]
    at br.com.fipesearch.FipesearchApplication.run(FipesearchApplication.java:19) ~[classes/:na]
    at org.springframework.boot.SpringApplication.lambda$callRunner$5(SpringApplication.java:790) ~[spring-boot-3.2.3.jar:3.2.3]
    at org.springframework.util.function.ThrowingConsumer$1.acceptWithException(ThrowingConsumer.java:83) ~[spring-core-6.1.4.jar:6.1.4]
    at org.springframework.util.function.ThrowingConsumer.accept(ThrowingConsumer.java:60) ~[spring-core-6.1.4.jar:6.1.4]
    at org.springframework.util.function.ThrowingConsumer$1.accept(ThrowingConsumer.java:88) ~[spring-core-6.1.4.jar:6.1.4]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:798) ~[spring-boot-3.2.3.jar:3.2.3]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:789) ~[spring-boot-3.2.3.jar:3.2.3]
    at org.springframework.boot.SpringApplication.lambda$callRunners$3(SpringApplication.java:774) ~[spring-boot-3.2.3.jar:3.2.3]
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[na:na]
    at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
    at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[na:na]
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
    at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[na:na]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:774) ~[spring-boot-3.2.3.jar:3.2.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:341) ~[spring-boot-3.2.3.jar:3.2.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[spring-boot-3.2.3.jar:3.2.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-3.2.3.jar:3.2.3]
    at br.com.fipesearch.FipesearchApplication.main(FipesearchApplication.java:12) ~[classes/:na]
Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:578) ~[java.net.http:na]
    at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123) ~[java.net.http:na]
    at br.com.fipesearch.service.ConnectionFIPEAPI.getDataByUrl(ConnectionFIPEAPI.java:18) ~[classes/:na]
    ... 23 common frames omitted

Pessoal, meu problema na verdade é pior do que eu imaginava, porque o curso seguinte de JPA usa o mesmo projeto desse curso e, consequentemente, consome a mesma API.

Ou seja, tou travado não consigo concluir mas a formação porque aparentemente os 2 cursos seguintes utilizam da API que estou com problema.

Oi, Fábio! Tudo bem?

Pelo que entendi, seu problema está no desafio, certo? Então pode ficar despreocupado, que no curso 2 a gente usa somente API do OMDB. Essa API da tabela FIPE ficou só nesse desafio mesmo, e você conseguirá fazer as próximas aulas.

Sinto muito pela sua experiência com o desafio. Vamos analisar aqui pra procurar alguma solução para o seu problema, e te dou um retorno.

Bons estudos!

Olá Yasmim, bom dia!

Obrigado por lembrar disso. Realmente, dá pra trocar o endereço da API do OMDB para http (fiz isso no curso de outra formação inclusive, por isso que consegui fazer o desafio da outra formação). Quando vi dando o erro me desesperei mas realmente vou conseguir continuar :)

Mas por favor não percam de vista de tentar simular esse problema para que não atrapalhe outros alunos.

Muito obrigado pelo retorno.