Введение: REST API на C# — это просто
REST API (Representational State Transfer) — это архитектурный стиль для создания веб-сервисов, который сегодня используется практически в каждом современном приложении. Если вы хотите быстро научиться писать бэкенд на C#, то ASP.NET Core — лучший выбор для старта. В этой статье мы за 30 минут создадим полноценный REST API для управления списком задач (Todo List). Вы узнаете, как настроить проект, написать контроллеры, подключить базу данных и протестировать API через Swagger.
Готовы? Поехали!
Шаг 1: Создание проекта и настройка окружения
Первым делом нам понадобится установленный .NET SDK (версия 6.0 или новее). Скачать его можно с официального сайта Microsoft. После установки открываем терминал или командную строку и создаём новый проект:
dotnet new webapi -n TodoApi
cd TodoApi
Эта команда создаст шаблон веб-API с предустановленным Swagger. Откройте проект в Visual Studio Code или любой другой IDE. Структура проекта уже включает папки Controllers, Models и файл Program.cs.
Теперь добавим поддержку Entity Framework Core для работы с базой данных. Установим необходимые пакеты:
dotnet add package Microsoft.EntityFrameworkCore.InMemory
dotnet add package Microsoft.EntityFrameworkCore.Design
Мы используем InMemory-базу для простоты — данные будут храниться в оперативной памяти. Для продакшена вы можете заменить её на SQL Server или PostgreSQL.
Шаг 2: Создание модели данных и контекста БД
Создадим модель TodoItem. В папке Models создайте файл TodoItem.cs:
namespace TodoApi.Models;
public class TodoItem
{
public long Id { get; set; }
public string? Title { get; set; }
public bool IsComplete { get; set; }
}
Теперь создадим контекст базы данных. В папке 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; }
}
Зарегистрируем контекст в Program.cs:
using Microsoft.EntityFrameworkCore;
using TodoApi.Data;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<TodoContext>(opt =>
opt.UseInMemoryDatabase("TodoList"));
builder.Services.AddControllers();
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();
Шаг 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(long 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(long id, TodoItem todoItem)
{
if (id != todoItem.Id) return BadRequest();
_context.Entry(todoItem).State = EntityState.Modified;
await _context.SaveChangesAsync();
return NoContent();
}
// DELETE: api/TodoItems/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteTodoItem(long id)
{
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null) return NotFound();
_context.TodoItems.Remove(todoItem);
await _context.SaveChangesAsync();
return NoContent();
}
}
Обратите внимание на атрибуты маршрутизации:
[Route("api/[controller]")]— задаёт базовый URL (api/TodoItems)[HttpGet],[HttpPost],[HttpPut],[HttpDelete]— определяют HTTP-методыasync Task<ActionResult>— асинхронная обработка запросов
Шаг 4: Тестирование API через Swagger
Запустите проект:
dotnet run
После сборки в консоли появится ссылка вида https://localhost:5001. Откройте браузер и перейдите по адресу https://localhost:5001/swagger. Вы увидите интерфейс Swagger UI со всеми эндпоинтами нашего API.
Протестируем создание задачи:
- Нажмите на
POST /api/TodoItems - Нажмите "Try it out"
- Введите JSON:
{ "title": "Изучить C#", "isComplete": false } - Нажмите "Execute" — в ответе получите созданный объект с ID
Теперь проверьте GET-запрос — вы увидите список задач. Можно также обновить задачу через PUT или удалить через DELETE. Всё работает!
Заключение: что дальше?
Поздравляю! Вы только что создали полноценный REST API на C# за 30 минут. Мы прошли все ключевые этапы: настройку проекта, модель данных, контекст БД