Este artigo é parte da série:

A função abaixo, “RequisitaAPI”, encapsula todo o processo de requisição a uma REST API:
private string RequisitaAPI(string endPoint)
{
return RequisitaAPI(endPoint, HttpMethod.Get);
}
private string RequisitaAPI(string endPoint, HttpMethod Verbo)
{
string ret = string.Empty;
var request = (HttpWebRequest)WebRequest.Create(endPoint);
request.Method = Verbo.ToString();
HttpWebResponse response = null;
try
{
response = (HttpWebResponse)request.GetResponse();
using (Stream responseStream = response.GetResponseStream())
{
if (responseStream != null)
{
using (StreamReader reader = new StreamReader(responseStream))
{
ret = reader.ReadToEnd();
}
}
}
}
catch (Exception ex)
{
ret = "{\"errorMessages\":[\"" + ex.Message.ToString() + "\"],\"errors\":{}}";
}
finally
{
if (response != null)
{
((IDisposable)response).Dispose();
}
}
return ret;
}Essa função retorna o resultado bruto da requsição, apenas a string de retorno sem qualquer tratamento. Partindo-se do princípio que o retorno será um conteúdo JSON, se faz necessário alguns passos para transformá-lo em objeto.
Vamos continuar utilizando como exemplo, o serviço ViaCEP, que retorna como resultado todos os dados de um determinado endereço a partir do CEP informado. A resposta da API do ViaCEP é um JSON com o seguinte formato:
{
"cep": "01001-000",
"logradouro": "Praça da Sé",
"complemento": "lado ímpar",
"unidade": "",
"bairro": "Sé",
"localidade": "São Paulo",
"uf": "SP",
"estado": "São Paulo",
"regiao": "Sudeste",
"ibge": "3550308",
"gia": "1004",
"ddd": "11",
"siafi": "7107"
}Então, o primeiro passo para tratá-lo como objeto em nosso programa é criar um model com esse formato. Para tal, vamos criar um novo arquivo em nosso projeto exemplo, com o nome “CEP.cs” embaixo de “Models”.

Para incrementar um pouco mais nosso projeto, vamos criar duas classes: “CEP” e “ViaCEP”, sendo que “ViaCEP” vai ser para receber o objeto enviado pelo serviço ViaCEP, enquanto “CEP” vai ser o retorno enviado pelo nosso programa.
namespace Treino_REST_02.Models
{
public class CEP
{
public string? Codigo { get; set; }
public string? Logradouro { get; set; }
public string? LogradouroTipo { get; set; }
public string? LogradouroNome { get; set; }
public string? Bairro { get; set; }
public string? Cidade { get; set; }
public string? UF { get; set; }
public string? Estado { get; set; }
public string? Regiao { get; set; }
public string? DDD { get; set; }
}
public class ViaCEP
{
public string? cep { get; set; }
public string? logradouro { get; set; }
public string? complemento { get; set; }
public string? unidade { get; set; }
public string? bairro { get; set; }
public string? localidade { get; set; }
public string? uf { get; set; }
public string? estado { get; set; }
public string? regiao { get; set; }
public string? ibge { get; set; }
public string? gia { get; set; }
public string? ddd { get; set; }
public string? siafi { get; set; }
}
}A função JsonSerializer.Deserialize<Tipo> recebe uma string JSON e transforma em um objeto especificado lá no tipo.
Para que tudo funcione agora só precisamos ler o conteúdo da API com a função que acabamos de criar “RequisitaAPI” e transformar este conteúdo em objeto utilizando o método Deserialize.
string endPoint = "https://viacep.com.br/ws/" + CEPDesejado + "/json";
string ResponseValue = string.Empty;
ResponseValue = RequisitaAPI(endPoint);
ViaCEP dto = JsonSerializer.Deserialize<ViaCEP>(ResponseValue);
Com o código acima, temos um objeto chamado “dto” que contém a resposta da requisição à API no forma do ViaCEP, mas como eu disse antes, vamos incrementar um pouco nosso resultado, entregando uma resposta customizada no formato CEP especificado em model. Para converter o objeto ViaCEP em CEP vou utilizar o seguinte código:
CEP ret = new CEP();
ret.Codigo = dto.cep;
ret.Logradouro = dto.logradouro;
ret.LogradouroTipo = dto.logradouro.Substring(0, dto.logradouro.IndexOf(" "));
ret.LogradouroNome = dto.logradouro.Substring(dto.logradouro.IndexOf(" ")+1);
ret.Bairro = dto.bairro;
ret.Cidade = dto.localidade;
ret.UF = dto.uf;
ret.Estado = dto.estado;
ret.DDD = dto.ddd;
ret.Regiao = dto.regiao;
Dessa forma, o formato final do nosso código vai ficar assim:
[Route("api/ConsultaCEP")]
[ApiController]
public class ConsultaCEPController : ControllerBase
{
[HttpGet(Name = "Consulta")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult<CEP> Consulta(string Codigo)
{
string endPoint = "https://viacep.com.br/ws/" + Codigo + "/json";
string ResponseValue = string.Empty;
ResponseValue = RequisitaAPI(endPoint);
if (ResponseValue.Contains("errorMessages"))
{
return BadRequest(ResponseValue);
}
ViaCEP dto = JsonSerializer.Deserialize<ViaCEP>(ResponseValue);
if (dto.cep== null)
{
return NotFound();
}
CEP ret = new CEP();
ret.Codigo = dto.cep;
ret.Logradouro = dto.logradouro;
ret.LogradouroTipo = dto.logradouro.Substring(0, dto.logradouro.IndexOf(" "));
ret.LogradouroNome = dto.logradouro.Substring(dto.logradouro.IndexOf(" ")+1);
ret.Bairro = dto.bairro;
ret.Cidade = dto.localidade;
ret.UF = dto.uf;
ret.Estado = dto.estado;
ret.DDD = dto.ddd;
ret.Regiao = dto.regiao;
return Ok(ret);
}
}