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); }