Muitas vezes precisamos consumir serviços web e sempre acabamos por escrever algumas linhas de código para que isso seja feito, hoje você verá que isso é coisa do passado e vamos integrar com um serviço de forma simples e criando apenas uma interface e uma classe que fará o parser do json.
Há alguns dias precisamos buscar um endereço através de um CEP e achamos uma lib bem bacana que faz isso, o Postmon, é uma lib feita em Python e então eu decidi pegar isso como exemplo e fazer uma API que consuma esse serviço e traga o endereço.
Bom, o Feign é um projeto que faz parte do grande guarda-chuvas de soluções do Spring Cloud e ele basicamente é utilizado para integração com serviços Rest, então vamos lá ver como isso funciona 🙂

A API a ser chamada devolve um json com a seguinte estrutura:
{
"bairro": "Bela Vista",
"cidade": "São Paulo",
"cep": "01317010",
"logradouro": "Rua Professor Sebastião Soares de Faria",
"estado_info": {
"area_km2": "248.222,362",
"codigo_ibge": "35",
"nome": "São Paulo"
},
"cidade_info": {
"area_km2": "1521,11",
"codigo_ibge": "3550308"
},
"estado": "SP"
}
Legal, mas essa estrutura tem mais coisas do que eu quero então vamos dar uma “enxugada” nela e devolver apenas os campos: logradouro, bairro, cidade e estado. Então criamos uma classe igual a exibida abaixo:
import lombok.Data;
@Data
public class CepResponse {
private String logradouro;
private String bairro;
private String cidade;
private String estado;
}
Beleza, após criar essa classe vamos criar a interface que FeignClient que irá fazer a chamada para o serviço, isso mesmo, criamos apenas uma interface e ela faz toda a “mágica” de chamar o serviço e fazer o parser dos dados. Veja como fica a interface:
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name = "cepService", url = "http://api.postmon.com.br")
public interface CepService {
@RequestMapping("/v1/cep/{cep}")
CepResponse getCep(@PathVariable("cep") String cep);
}
Agora é só criar o seu serviço rest que ficará exposto no seu projeto, para isso é só criar a classe abaixo:
import br.com.easy.cep.integration.CepResponse;
import br.com.easy.cep.integration.CepService;
import lombok.AllArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
@RestController
@AllArgsConstructor
@RequestMapping("v1/ceps")
public class CepRestService {
private final CepService cepService;
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/{cep}", method = RequestMethod.GET)
public CepResponse getCep(@PathVariable String cep) {
return cepService.getCep(cep);
}
}
E por fim é só anotar a sua classe de startup com a anotação @EnableFeignClients:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
@EnableFeignClients
@SpringBootApplication
public class EasyCepApplication {
public static void main(String[] args) {
SpringApplication.run(EasyCepApplication.class, args);
}
}
Pronto, agora você já tem um endpoint que consome um outro endpoint de maneira simples e com poucas linhas de código, qualquer dúvida postem nos comentários, para ver o código é só acessar esse link.
Até o próximo post!



