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.