Facebook Pixel
Definindo o Endereço dos Endpoints na .NET Core REST API

Definindo o Endereço dos Endpoints na .NET Core REST API

Este artigo funciona de forma independente, porém se quiser entender todo o contexto dos exemplos citados, saiba que ele é continuação da série:

Até o momento, nossa API está bem documentada e com tudo funcionando, porém o endereço final das URLs, os endpoints, estão na forma do exemplo padrão gerado pelo Visual Studio, começando com “api/” e o nome do controller. Vamos agora colocar os endereços dos endpoints em sua forma defitiniva.

A rota deve ser definida no início da classe. A rota base está definida como “api/ListaUF” por causa do mapeamento da rota:

/// <summary>
/// Exemplo de operações com objeto em memória.
/// </summary>
[Route("api/ListaUF")]
[ApiController]
public class ListaUFController : ControllerBase
{

Como nossa classe faz operações com UFs, vamos mudar a rota para um nome mais amigável, digamos “UFs/Memoria”, já que a classe que estamos trabalhando no momento manipula as UFs em memória, nos próximos exercícios vamos manipular as UFs no banco de dados, então, para isso, basta mudar o comando para:

/// <summary>
/// Exemplo de operações com objeto em memória.
/// </summary>
[Route("UFs/Memoria")]
[ApiController]
public class ListaUFController : ControllerBase
{

Ainda podemos observar que todos os métodos apontam para o mesmo endpoint, e a única coisa que está identificando qual método da classe deve ser chamado é o método HTTP (get, post,…). Para definirmos endereço de endpoint amigável basta alterar a linha que aponta o http method. Por exemplo, hoje temos:

    /// <summary>
    /// Relação de todas as UFs com suas capitais
    /// </summary>
    /// <returns></returns>
    [HttpGet(Name = "Listagem")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    public ActionResult<IEnumerable<UF>> ListaUF()
    {
        return Ok(UFs);
    }

    /// <summary>
    /// Mostra os dados de uma UF específica
    /// </summary>
    /// <remarks>
    /// Caso o id não exista, retorna 404 Not Found. Caso id seja zero retorna Bad Request.
    /// </remarks>
    /// <param name="IdUF">Id da UF que será mostrada</param>
    /// <returns>Um JSON contendo os dados da UF selecionada.</returns>
    [HttpGet("{IdUF:int}", Name = "MostraUF")]
    [ProducesResponseType(200)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    [ProducesResponseType(StatusCodes.Status404NotFound)]
    public ActionResult<UF> MostraUF(int IdUF)
    {
        if (IdUF == 0)
        {
            return BadRequest();
        }
        UF result = UFs.Find(x => x.Id == IdUF);
        if (result == null)
        {
            return NotFound();
        }
        return Ok(result);
    }

Para dar nome ao endpoint basta acrescentar um parâmetro à linha do método http, da seguinte forma, observe a mudança nas linhas 5 e 20 do código acima:

    /// <summary>
    /// Relação de todas as UFs com suas capitais
    /// </summary>
    /// <returns></returns>
    [HttpGet("ListaUF", Name = "Listagem")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    public ActionResult<IEnumerable<UF>> ListaUF()
    {
        return Ok(UFs);
    }

    /// <summary>
    /// Mostra os dados de uma UF específica
    /// </summary>
    /// <remarks>
    /// Caso o id não exista, retorna 404 Not Found. Caso id seja zero retorna Bad Request.
    /// </remarks>
    /// <param name="IdUF">Id da UF que será mostrada</param>
    /// <returns>Um JSON contendo os dados da UF selecionada.</returns>
    [HttpGet("MostraUF/{IdUF:int}", Name = "MostraUF")]
    [ProducesResponseType(200)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    [ProducesResponseType(StatusCodes.Status404NotFound)]
    public ActionResult<UF> MostraUF(int IdUF)
    {
        if (IdUF == 0)
        {
            return BadRequest();
        }
        UF result = UFs.Find(x => x.Id == IdUF);
        if (result == null)
        {
            return NotFound();
        }
        return Ok(result);
    }

Com essas mudanças, agora o URL final dos endpoints acima passa a ser:

../UFs/Memoria/ListaUF
../UFs/Memoria/MostraUF/<id da UF>

Aplicando essa mudança em todo o código, vai ficar assim:

/// <summary>
/// Exemplo de operações com objeto em memória.
/// </summary>
[Route("UFs/Memoria")]
[ApiController]
public class ListaUFController : ControllerBase
{

    static List<UF> UFs = new List<UF>();

    /// <summary>
    /// Construtor
    /// </summary>
    public ListaUFController()
    {
        if (UFs.Count == 0)
        {
            UFs.Add(new UF { Id = 1, Nome = "RJ", Capital = "Rio de Janeiro" });
            UFs.Add(new UF { Id = 2, Nome = "SP", Capital = "São Paulo" });
            UFs.Add(new UF { Id = 3, Nome = "BA", Capital = "Salvador" });
        }
    }

    /// <summary>
    /// Relação de todas as UFs com suas capitais
    /// </summary>
    /// <returns></returns>
    [HttpGet("ListaUF", Name = "Listagem")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    public ActionResult<IEnumerable<UF>> ListaUF()
    {
        return Ok(UFs);
    }

    /// <summary>
    /// Mostra os dados de uma UF específica
    /// </summary>
    /// <remarks>
    /// Caso o id não exista, retorna 404 Not Found. Caso id seja zero retorna Bad Request.
    /// </remarks>
    /// <param name="IdUF">Id da UF que será mostrada</param>
    /// <returns>Um JSON contendo os dados da UF selecionada.</returns>
    [HttpGet("MostraUF/{IdUF:int}", Name = "MostraUF")]
    [ProducesResponseType(200)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    [ProducesResponseType(StatusCodes.Status404NotFound)]
    public ActionResult<UF> MostraUF(int IdUF)
    {
        if (IdUF == 0)
        {
            return BadRequest();
        }
        UF result = UFs.Find(x => x.Id == IdUF);
        if (result == null)
        {
            return NotFound();
        }
        return Ok(result);
    }

    /// <summary>
    /// Adiciona uma nova UF à lista
    /// </summary>
    /// <param name="NovaUF"></param>
    /// <returns></returns>
    [HttpPost("AdicionaUF", Name ="Adiciona")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    [ProducesResponseType(StatusCodes.Status404NotFound)]
    public ActionResult<IEnumerable<UF>> AdicionaUF(UF NovaUF)
    {
        if (NovaUF.Id > 0)
        {
            return AtualizaUF(NovaUF.Id, NovaUF.Nome, NovaUF.Capital);
        }
        UFs.Add(NovaUF);
        return Ok(UFs);
    }

    /// <summary>
    /// Altera todos os dados de uma UF baseado em um id
    /// </summary>
    /// <param name="IdUF">Id da UF que será alterada</param>
    /// <param name="NomeUF">Novo nome (sigla) da UF</param>
    /// <param name="CapitalUF">Novo nome da capital</param>
    /// <returns></returns>
    [HttpPut("AtualizaUF", Name = "Altera")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    [ProducesResponseType(StatusCodes.Status404NotFound)]
    public ActionResult<IEnumerable<UF>> AtualizaUF(int IdUF, string NomeUF, string CapitalUF)
    {
        if (IdUF == 0)
        {
            return BadRequest();
        }
        UF result = UFs.Find(x => x.Id == IdUF);
        if (result == null)
        {
            return NotFound();
        }
        result.Nome = NomeUF;
        result.Capital = CapitalUF;
        return Ok(result);
    }

    /// <summary>
    /// Muda apenas a capital de uma UF baseado no nome da UF
    /// </summary>
    /// <param name="NomeUF">Nome da UF (sigla)</param>
    /// <param name="NovaCapital">Nome da nova capital</param>
    /// <returns></returns>
    [HttpPatch("MudaCapital", Name = "MudaCapital")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    [ProducesResponseType(StatusCodes.Status404NotFound)]
    public ActionResult<IEnumerable<UF>> MudaCapital(string NomeUF, string NovaCapital)
    {
        if (NomeUF == "")
        {
            return BadRequest();
        }
        UF result = UFs.Find(x => x.Nome == NomeUF);
        if (result == null)
        {
            return NotFound();
        }
        result.Capital = NovaCapital;
        return Ok(result);
    }

    /// <summary>
    /// Elimina uma UF baseado no id
    /// </summary>
    /// <param name="DelId">Id da UF que será eliminada</param>
    /// <returns></returns>
    [HttpDelete("EliminaUF", Name ="EliminaUF")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    [ProducesResponseType(StatusCodes.Status404NotFound)]
    public ActionResult<IEnumerable<UF>> EliminaUF(int DelId)
    {
        if (DelId == 0)
        {
            return BadRequest();
        }
        UF result = UFs.Find(x => x.Id == DelId);
        if (result == null)
        {
            return NotFound();
        }
        UFs.Remove(result);
        return Ok(UFs);
    }
}

E os endereços agora ficarão formados desta forma:

Próximo:

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *