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!