Введение: REST API на C# — это просто
REST API (Representational State Transfer) — это архитектурный стиль, который позволяет клиентам и серверам обмениваться данными через HTTP. В современной веб-разработке API — это стандарт де-факто для создания бэкенда мобильных приложений, веб-сайтов и микросервисов. На платформе .NET (C#) разработка REST API максимально оптимизирована: вы можете получить работающий прототип буквально за полчаса, даже если вы новичок.
В этой статье мы создадим полноценный REST API для управления списком задач (ToDo List). Вы узнаете, как настроить проект ASP.NET Core Web API, создать модель данных, реализовать CRUD-операции (Create, Read, Update, Delete) и протестировать API через Swagger. Весь процесс займёт не более 30 минут.
1. Создание проекта и установка зависимостей
Первым делом откройте Visual Studio 2022 (или Visual Studio Code с установленным .NET SDK 6.0/7.0/8.0). Выполните следующие шаги:
- Выберите Создать новый проект → ASP.NET Core Web API.
- Назовите проект, например
TodoApi. - Убедитесь, что выбран фреймворк .NET 8.0 (или выше).
- Снимите галочку Use controllers, если хотите использовать минимальное API, но в этом руководстве мы будем использовать классические контроллеры — оставьте галочку.
- Нажмите Создать.
После создания проекта структура будет выглядеть так:
TodoApi/
├── Controllers/
├── Models/
├── Program.cs
└── appsettings.json
Установка дополнительных пакетов не требуется — все необходимые компоненты уже встроены в ASP.NET Core.
2. Создание модели данных и контекста базы данных
2.1. Модель TodoItem
Создайте папку Models и добавьте в неё класс TodoItem.cs:
namespace TodoApi.Models;
public class TodoItem
{
public int Id { get; set; }
public string? Title { get; set; }
public bool IsComplete { get; set; }
}
Это минимальная модель: идентификатор, название задачи и флаг завершения.
2.2. Контекст базы данных
Теперь создадим контекст для Entity Framework Core. В папке Data (создайте её) добавьте класс 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. Настройка Program.cs
Откройте Program.cs и добавьте регистрацию контекста и Swagger:
using Microsoft.EntityFrameworkCore;
using TodoApi.Data;
var builder = WebApplication.CreateBuilder(args);
// Добавляем контроллеры
builder.Services.AddControllers();
// Регистрируем контекст БД (используем InMemory для простоты)
builder.Services.AddDbContext<TodoContext>(opt =>
opt.UseInMemoryDatabase("TodoList"));
// Swagger
builder.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();
Обратите внимание: мы используем UseInMemoryDatabase — это удобно для прототипирования. В реальном проекте замените на SQL Server, PostgreSQL или другую БД.
3. Реализация контроллера с CRUD-операциями
Теперь самое главное — контроллер. Создайте в папке Controllers файл 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 item = await _context.TodoItems.FindAsync(id);
if (item == null)
return NotFound();
return item;
}
// POST: api/TodoItems
[HttpPost]
public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItem item)
{
_context.TodoItems.Add(item);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetTodoItem), new { id = item.Id }, item);
}
// PUT: api/TodoItems/5
[HttpPut("{id}")]
public async Task<IActionResult> PutTodoItem(int id, TodoItem item)
{
if (id != item.Id)
return BadRequest();
_context.Entry(item).State = EntityState.Modified;
await _context.SaveChangesAsync();
return NoContent();
}
// DELETE: api/TodoItems/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteTodoItem(int id)
{
var item = await _context.TodoItems.FindAsync(id);
if (item == null)
return NotFound();
_context.TodoItems.Remove(item);
await _context.SaveChangesAsync();
return NoContent();
}
}
Что здесь происходит:
- GET — получение всех задач или одной по ID.
- POST — создание новой задачи. Возвращает HTTP 201 (Created) с ссылкой на созданный ресурс.
- PUT — полное обновление задачи. Возвращает HTTP 204 (No Content).
- DELETE — удаление задачи. Также возвращает 204.
Контроллер асинхронный — это стандарт для современных приложений.
4. Тестирование API через Swagger
Запустите проект (F5). Откроется браузер с интерфейсом Swagger (по адресу https://localhost:5001/swagger). Swagger автоматически генерирует документацию по ваш