Facebook Pixel
Melhorando a Documentação do Swagger com C# no .NET Core

Melhorando a Documentação do Swagger com C# no .NET Core

Este artigo é parte da série:

É possível deixar o Swagger bem mais amigável, apresentando informações mais específicas em relação ao projeto. Vamos começar alterando as informações de cabeçalho. Para isso, em “Program.cs”, vamos alterar a linha:

builder.Services.AddSwaggerGen();

Certifique-se que o pacote “Swashbuckle.AspNetCore” está instalado.

Certifique-se também que, ao compilar, o programa esteja gerando o arquivo de documentação da API. Para isso, vá nas propriedades do projeto, aba Certifique-se também que, ao compilar, o programa esteja gerando o arquivo de documentação da API. Para isso, vá nas propriedades do projeto, aba “Build”, “Output”, “Generate a file containing API Documentation” deve estar marcado.

Neste exemplo, vou alterar o título e a descrição. Também vou adicionar alguns links ao cabeçalho. Os endereços utilizados são para o site da minha empresa, e utilizei apenas a título de exemplo.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new OpenApiInfo
    {
        Version = "v1",
        Title = "Treino REST API",
        Description = "Como desenvolver um REST API utilizando C# e .NET Core",
        TermsOfService = new Uri("https://www.larsoft.com.br/autenticacao-em-2-fatores-2fa-nos-sistemas-larsoft/"),
        Contact = new OpenApiContact
        {
            Name = "Entre em contato com a Larsoft",
            Url = new Uri("https://www.larsoft.com.br/institucional/contato/")
        },
        License = new OpenApiLicense
        {
            Name = "Como a Larsoft trata a segurança de dados",
            Url = new Uri("https://www.larsoft.com.br/institucional/seguranca/")
        }
    });
});

Fazendo isso já podemos observar uma mudança significativa no cabeçalho:

É possível também inserir uma série de informações em cada um dos métodos. Para isso, basta utilizar a mesma notação para documentação das classes, precedento a classe com o comando “///” e preechendo as opções, coforme exemplo:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Net;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using System.Text.Json;
using Treino_REST_02.Models;

namespace Treino_REST_02.Controllers
{

    /// <summary>
    /// Exemplo de operações com objeto em memória.
    /// </summary>
    [Route("api/ListaUF")]
    [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(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);
        }

        /// <summary>
        /// Adiciona uma nova UF à lista
        /// </summary>
        /// <param name="NovaUF"></param>
        /// <returns></returns>
        [HttpPost(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(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(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(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);
        }
    }
}

Agora o Swagger traz muito mais informações sobre o método:

Próxima etapa:

Deixe seu comentário