DEV Community

Cover image for Como consumir uma API externa na sua aplicação Spring Boot
Daiene Lima
Daiene Lima

Posted on • Edited on

Como consumir uma API externa na sua aplicação Spring Boot

Em algum momento pode acontecer da nossa aplicação ter a necessidade de consumir ou se integrar com um serviço externo.
Pensando nisso surgiu um projeto chamado Feign.

O que é Feign?

O Feign é um projeto que está dentro do Spring Cloud ele é
utilizado para integração e consumo de serviços rest.

Ele torna o consumo de clients de serviço da web mais fácil. Foi
inspirado no Retrofit e JAX-RS-2.0.
Uma grande facilidade do uso do Feign é que não precisamos
escrever nenhum código para chamar o serviço, a não ser uma
definição de interface.

@FeignClient é a notação que torna o consumo do serviço
extremamente simples.

Eu vou mostrar um exemplo simples consumindo a api
viacep.com.br/ws/{cep}/json/

A api devolve um json na seguinte estrutura;

Alt Text

  • Vamos adicionar duas dependências ao nosso pom.xml

spring-cloud-starter-openfeign

 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 
Enter fullscreen mode Exit fullscreen mode

spring-cloud-dependencies

 <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR8</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 
Enter fullscreen mode Exit fullscreen mode
  • Configurações do Projeto

Precisamos anotar @EnableFeignClients na classe principal do
projeto, para habilitar o Feign, no caso aqui a classe
Application.
Com essa anotação habilitamos uma busca pela interface client
que devem ser consumida.

@SpringBootApplication @EnableFeignClients public class ConsumoApplication { public static void main(String[] args) { SpringApplication.run(ConsumoApplication.class, args); } } 
Enter fullscreen mode Exit fullscreen mode
  • Criaremos a classe que vai retornar nosso objeto
 public class Endereco { private String cep; private String logradouro; private String complemento; private String bairro; private String localidade; private String uf; private String ibge; private String gia; private String ddd; private String siafi; } 
Enter fullscreen mode Exit fullscreen mode
  • Criaremos uma interface onde o @FeignClient irá fazer a chamada do serviço.

Os parâmetros url e name são obrigatórios;
onde url: é a base do serviço que vai ser consumido
e name: o nome do cliente
Precisamos dizer qual o Endepoint o buscarEnderecoPorCep vai
utilizar;

@FeignClient(url= "https://viacep.com.br/ws/" , name = "viacep") public interface CepService { @GetMapping("{cep}/json") Endereco buscaEnderecoPorCep(@PathVariable("cep") String cep); } 
Enter fullscreen mode Exit fullscreen mode
  • Agora é só criar a rota que usaremos para consumir o serviço;
@RestController public class CepRestService { @Autowired private CepService cepService; @GetMapping("/{cep}") public ResponseEntity<Endereco> getCep(@PathVariable String cep) { Endereco endereco = cepService.buscaEnderecoPorCep(cep); return endereco != null ? ResponseEntity.ok().body(endereco) : ResponseEntity.notFound().build(); } } 
Enter fullscreen mode Exit fullscreen mode

Pronto, agora sua aplicação está consumindo um serviço externo
com poucas linhas e com o mesmo resultado que teríamos com
RestTemplate.

Alt Text

Link da aplicação modelo no git Exemplo

Top comments (6)

Collapse
 
leonardosilvacosta profile image
Leonardo da Silva Costa • Edited

Parabéns, Daiene 👏👏👏! Conteúdo massa! :)
Agregou bastante.

Collapse
 
tacianosilva profile image
Taciano Morais Silva

Olá, achei bem interessante esse projeto. Contudo, quando adicionei esse service no meu projeto ocorreu o seguinte erro:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configurationPropertiesBeans' defined in class path resource [org/springframework/cloud/autoconfigure/ConfigurationPropertiesRebinderAutoConfiguration.class]

É necessário algum arquivo @Configuration?

Collapse
 
coutomariel profile image
Mariel Vieira Couto

Tive o mesmo problema que você amigo.

Estava usando a versão 2.4.3 do Spring, aí dei uma gogleada e li relatos de incompatibilidade a partir da 2.4.0
Achei estranho, mas aí troque a versão para a mesma usado no exemplo e ao fazer o rebuild rodou certinho.

Collapse
 
daienelima profile image
Daiene Lima

Oi, vc adicionou as duas anotações necessárias para a configuração ? @EnableFeignClients na class main e @FeignClient no service do endpoint ?
se tiver o repo no git eu posso olhar pra vc

Collapse
 
coutomariel profile image
Mariel Vieira Couto

Daiene. Parabéns por compartilhar conhecimento.
O conteúdo me deu uma baita luz aqui.

Collapse
 
daienelima profile image
Daiene Lima

eu que agradeço por ler meus conteúdos.