Como escrever uma REST API em C# em 30 minutos: guia passo a passo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: REST API em C# é simples



REST API (Representational State Transfer) é um estilo arquitetural que permite que clientes e servidores troquem dados via HTTP. No desenvolvimento web moderno, API é o padrão de facto para criar o backend de aplicativos móveis, sites e microsserviços. Na plataforma .NET (C#), o desenvolvimento de REST API é altamente otimizado: você pode obter um protótipo funcional em literalmente meia hora, mesmo sendo iniciante.



Neste artigo, criaremos uma REST API completa para gerenciar uma lista de tarefas (ToDo List). Você aprenderá como configurar um projeto ASP.NET Core Web API, criar um modelo de dados, implementar operações CRUD (Create, Read, Update, Delete) e testar a API via Swagger. Todo o processo levará no máximo 30 minutos.



1. Criação do projeto e instalação de dependências



Primeiramente, abra o Visual Studio 2022 (ou Visual Studio Code com .NET SDK 6.0/7.0/8.0 instalado). Siga os passos abaixo:



  1. Selecione Criar novo projeto → ASP.NET Core Web API.
  2. Nomeie o projeto, por exemplo TodoApi.
  3. Certifique-se de que o framework .NET 8.0 (ou superior) está selecionado.
  4. Desmarque a opção Use controllers se quiser usar a API mínima, mas neste tutorial usaremos controllers clássicos — mantenha a opção marcada.
  5. Clique em Criar.


Após a criação do projeto, a estrutura será assim:



TodoApi/├── Controllers/├── Models/├── Program.cs└── appsettings.json


Não é necessária a instalação de pacotes adicionais — todos os componentes necessários já estão incorporados no ASP.NET Core.



2. Criação do modelo de dados e contexto do banco de dados



2.1. Modelo TodoItem



Crie uma pasta Models e adicione a classe TodoItem.cs:



namespace TodoApi.Models;

public class TodoItem{ public int Id { get; set; } public string? Title { get; set; } public bool IsComplete { get; set; }}


Este é o modelo mínimo: identificador, título da tarefa e flag de conclusão.



2.2. Contexto do banco de dados



Agora vamos criar o contexto para o Entity Framework Core. Na pasta Data (crie-a), adicione a classe TodoContext.cs:



using Microsoft.EntityFrameworkCore;using TodoApi.Models;

namespace TodoApi.Data;

public class TodoContext : DbContext{ public TodoContext(DbContextOptions<TodoContext> options) : base(options) { }

public DbSet<TodoItem> TodoItems { get; set; }}


2.3. Configuração do Program.cs



Abra o Program.cs e adicione o registro do contexto e do Swagger:



using Microsoft.EntityFrameworkCore;using TodoApi.Data;

var builder = WebApplication.CreateBuilder(args);

// Adicionamos controllersbuilder.Services.AddControllers();

// Registramos o contexto do BD (usamos InMemory para simplicidade)builder.Services.AddDbContext<TodoContext>(opt => opt.UseInMemoryDatabase("TodoList"));

// Swaggerbuilder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment()){ app.UseSwagger(); app.UseSwaggerUI();}

app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();

app.Run();


Observe: usamos UseInMemoryDatabase — isso é conveniente para prototipagem. Em um projeto real, substitua por SQL Server, PostgreSQL ou outro banco de dados.



3. Implementação do controller com operações CRUD



Agora, o mais importante — o controller. Crie na pasta Controllers o arquivo TodoItemsController.cs:



using Microsoft.AspNetCore.Mvc;using Microsoft.EntityFrameworkCore;using TodoApi.Data;using TodoApi.Models;

namespace TodoApi.Controllers;

[Route("api/[controller]")][ApiController]public class TodoItemsController : ControllerBase{ private readonly TodoContext _context;

public TodoItemsController(TodoContext context) { _context = context; }

// GET: api/TodoItems [HttpGet] public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems() { return await _context.TodoItems.ToListAsync(); }

// GET: api/TodoItems/5 [HttpGet("{id}")] public async Task<ActionResult<TodoItem>> GetTodoItem(int id) { var todoItem = await _context.TodoItems.FindAsync(id);

if (todoItem == null) { return NotFound(); }

return todoItem; }

// POST: api/TodoItems [HttpPost] public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItem todoItem) { _context.TodoItems.Add(todoItem); await _context.SaveChangesAsync();

return CreatedAtAction(nameof(GetTodoItem), new { id = todoItem.Id }, todoItem); }

// PUT: api/TodoItems/5 [HttpPut("{id}")] public async Task<IActionResult> PutTodoItem(int id, TodoItem todoItem) { if (id != todoItem.Id) { return BadRequest(); }

_context.Entry(todoItem).State = EntityState.Modified;

try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!TodoItemExists(id)) { return NotFound(); } else { throw; } }

return NoContent(); }

// DELETE: api/TodoItems/5 [HttpDelete("{id}")] public async Task<IActionResult> DeleteTodoItem(int id) { var todoItem = await _context.TodoItems.FindAsync(id); if (todoItem == null) { return NotFound(); }

_context.TodoItems.Remove(todoItem); await _context.SaveChangesAsync();

return NoContent(); }

private bool TodoItemExists(int id) { return _context.TodoItems.Any(e => e.Id == id); }}

Blogs

Book Recommendations