APIs e Microsserviços

19 jul, 2017

Consumindo serviços de forma fácil com Spring-Cloud-Feign

Publicidade

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 🙂

Consumindo serviços de forma fácil com Spring-Cloud-Feign
Consumindo serviços de forma fácil com Spring-Cloud-Feign

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!