[JAVA - PT-BR] CONSUMINDO UMA API DE CEP
Tags: beginners, java, braziliandevs, tutorial
Published: 2022-10-22 16:19:27

Recentemente resolvi aprender um pouco mais sobre a programação em Java e desde então tenho consultado bastante conteúdo usar esta linguagem com foco no consumo e desenvolvimento de [API's](https://www.techtudo.com.br/listas/2020/06/o-que-e-api-e-para-que-serve-cinco-perguntas-e-respostas.ghtml). 

**CONSUMINDO UME ENDPOINT**
Um endpoint é o endereço utilizado para poder fazer requisições a um servidor, neste caso temos o exemplo abaixo para a nossa integração. 
`viacep.com.br/ws/01001000/json/`

Vamos utilizar algumas ferramentas para poder realizar o teste das requisições, neste caso será utilizado o [Postman](https://documenter.getpostman.com/view/22238204/2s84DrQ2Mb), eu gosto de utilizar a plataforma pois dá um suporte a documentação entre outras ferramentas que podem ser utilizadas para fazer requisições. 

Retorno obtido:
```json
{
    "cep": "01001-000",
    "logradouro": "Praça da Sé",
    "complemento": "lado ímpar",
    "bairro": "Sé",
    "localidade": "São Paulo",
    "uf": "SP",
    "ibge": "3550308",
    "gia": "1004",
    "ddd": "11",
    "siafi": "7107"
}
```

Com base no retorno que tivemos vamos acessar o site [JsonSchema2](https://www.jsonschema2pojo.org/) para criarmos o nosso projeto em Java, basicamente é uma ferramenta que faz o mapeamento do retorno JSON e com isto cria as variáveis, métodos de encapsulamento para que podemos utilizar após o retorno obtido da API. 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vjzxxs152ti73a26xmib.png)


Após isto, clique em **preview** e veja se obteve um resultado semelhante a este:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/id0b61drd9mz52g61pvh.png)



Clique na opção **zip** para baixar o projeto. 

Após obter o código do projeto, vamos extrair e para manipular o arquivo estarei utilizando a ferramenta [Eclipse](https://www.eclipse.org/downloads/).

| Como abrir um projeto no Eclipse

Com o projeto aberto, localize a classe gerada e remova essa anotação `@Generated("jsonschema2pojo")
` e o import `import javax.annotation.Generated;
` pois ela não será útil, perceba que a plataforma gerou os métodos getteers e setteers e já está pronto para uso. 

Classe Endereco
```java

package br.consultacep;

import java.util.HashMap;
import java.util.Map;

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;
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    public String getCep() {
        return cep;
    }

    public void setCep(String cep) {
        this.cep = cep;
    }

    public String getLogradouro() {
        return logradouro;
    }

    public void setLogradouro(String logradouro) {
        this.logradouro = logradouro;
    }

    public String getComplemento() {
        return complemento;
    }

    public void setComplemento(String complemento) {
        this.complemento = complemento;
    }

    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public String getLocalidade() {
        return localidade;
    }

    public void setLocalidade(String localidade) {
        this.localidade = localidade;
    }

    public String getUf() {
        return uf;
    }

    public void setUf(String uf) {
        this.uf = uf;
    }

    public String getIbge() {
        return ibge;
    }

    public void setIbge(String ibge) {
        this.ibge = ibge;
    }

    public String getGia() {
        return gia;
    }

    public void setGia(String gia) {
        this.gia = gia;
    }

    public String getDdd() {
        return ddd;
    }

    public void setDdd(String ddd) {
        this.ddd = ddd;
    }

    public String getSiafi() {
        return siafi;
    }

    public void setSiafi(String siafi) {
        this.siafi = siafi;
    }

    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }
}
```
Crie uma outra classe para converter JSON em String, neste caso eu criei a Util, vamos precisar também de uma [biblioteca gson](https://github.com/EDUARDO-TEIXEIRA/ConsultaCEP-API/tree/main/libs) pois nela terá uma classe e métodos que auxiliará na conversão. 


```java
package br.utilitarios;

import java.io.BufferedReader;
import java.io.IOException;

public class Util {
	public static String converteJsonEmString(BufferedReader buffereReader) throws IOException {
		String resposta, jsonString = "";
		while ((resposta = buffereReader.readLine()) != null) {
			jsonString += resposta;
		}
		return jsonString;
	}

}

```

Crie uma nova classe para podermos fazer a requisição da API, neste exemplo eu criei a IntegracaoAPI:
```java
package br.consultacep;

import br.utilitarios.Util;

import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class IntegracaoAPI {	
	public static Endereco buscaCep (String cep) throws Exception {
		String enderecoURL = "https://viacep.com.br/ws/" + cep + "/json/";
		URL url = new URL(enderecoURL);
		HttpURLConnection conexao = (HttpURLConnection) url.openConnection();
		conexao.setRequestMethod("GET");
		conexao.setDoInput(true);
		try {
			BufferedReader buff = new BufferedReader(new InputStreamReader((conexao.getInputStream()), "utf-8"));
			
			String convertJsonString = Util.converteJsonEmString(buff);
			Gson gson = new Gson();
			Endereco endereco = gson.fromJson(convertJsonString, Endereco.class);
			return endereco;
			
		} catch (Exception msgErro) {
			throw  new Exception("Erro de conexão- status Code [" + conexao.getResponseCode() + "]. " + msgErro.toString()); 
		}
		
	}

}
```
## DEBUG CLASS INTEGRAÇÃO API
- Foi criado uma método que recebe como parâmetro um cep e retorna uma classe do tipo Endereço.
- Em seguida, foi aberto uma conexão e obtemos um retorno que é armazenado na variável `buff`, com isto é necessário que haja uma conversão do de JSON para String e com isto realizarmos a manipulação dos dados.
- Quando retornado os dados o método fromJson faz um mapeamento do que foi retornado com a nossa classe Endereço, sendo assim os atributos e variáveis devem ter os mesmos nomes para que haja pontos em comuns e com isto manipular os dados corretamente. 

Por último, crie uma classe para exibir os dados retornados da API:
```java
package br.consultacep;


import java.util.Scanner;

public class Principal {

	public static void main(String[] args) throws Exception {
        System.out.print("Informe seu CEP: ");
        String cep = new Scanner(System.in).nextLine();
        Endereco endereco = IntegracaoAPI.buscaCep(cep);
		
        System.out.println("CEP Consultado: ");
        System.out.println("Complemento: ");
        System.out.println("Logradouro: " + endereco.getLogradouro());
        System.out.println("Bairro: " + endereco.getBairro());
        System.out.println("Localidade: " + endereco.getLocalidade());
        System.out.println("DDD: " + endereco.getDdd());
	
	}	
}

```
Basta executar o projeto e informar um CEP, o resultado será este:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/glgwt7i3baq218rw80lv.png)

**Clonagem de repositório:** 
`https://github.com/EDUARDO-TEIXEIRA/ConsultaCEP-API.git`

### Referências
- [Documentação oficial da API](https://viacep.com.br/)