DEV Community

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

Posted on • Updated 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

Oldest comments (6)

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
 
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

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
 
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.

Collapse
 
leonardosilvacosta profile image
Leonardo da Silva Costa • Edited

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