Facebook Pixel
Consumindo REST API com C#

Consumindo REST API com C#

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

Deixe seu comentário