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: